CF717E
这道题属于是那种看上去很有思路,然后无从下手,写了个dfs感觉实在是不行。
后面仔细看了一下,这个题是用的构造dfs,基本是树上dfs,时间复杂度是O(V+E)
新构造的一个参数作为根,整个dfs表示这个根的子树已经全部变为黑色(除了根以外)
刚开始是一直搜,搜到最后如果是粉的,递归以后再单独处理一次
其实当时如果能想到直接从每个结点的根结点入手,这个题应该就不在话下了
只能说写着写着心乱了
#include<iostream>
#include<utility>
#include<vector>
using namespace std;
typedef long long ll;
#define fi(i,a,b) for(int i = a; i <= b; ++i)
#define fr(i,a,b) for(int i = a; i >= b; --i)
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define pb push_back
using pii = pair<int,int>;
//#define DEBUG
#define int long long
const int N = 2e5 + 5;
vector<int> tre[N];
int vex[N];
void dfs(int x,int y){
fi(i,0,sz(tre[x])-1){
int v = tre[x][i];
if(v == y) continue;
vex[v] ^= 1;
cout << v << " ";
dfs(v,x);
cout << x << " ";
vex[x] ^= 1;
if(vex[v] == 0)
cout << v << " " << x << " ",vex[v] ^=1 ,vex[x] ^= 1;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
fi(i,1,n) cin >> vex[i],vex[i] = max(vex[i],(ll)0);
fi(i,1,n-1){
int a,b;
cin >> a >> b;
tre[a].pb(b);
tre[b].pb(a);
}
cout << 1 << " ";
dfs(1,0);
if(vex[1] == 0)
cout << tre[1][0] << " " << 1 << " " << tre[1][0];
#ifdef DEBUG
//freopen(D:\in.txt,r,stdin);
#endif
return 0;
}