如果一个点是粉色,那么就走到它父亲再走回来
如果这个点是根,就去两次它的一个儿子
就这样dfs一边就好了
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=200010;
int n,cnt,a[N],G[N];
struct edge{
int t,nx;
}E[N<<1];
inline void addedge(int x,int y){
E[++cnt].t=y; E[cnt].nx=G[x]; G[x]=cnt;
E[++cnt].t=x; E[cnt].nx=G[y]; G[y]=cnt;
}
void dfs(int x,int f){
printf("%d ",x); a[x]=-a[x];
for(int i=G[x];i;i=E[i].nx)
if(E[i].t!=f) dfs(E[i].t,x);
if(a[x]<0){
if(f)
printf("%d %d ",f,x),a[f]=-a[f],a[x]=-a[x];
else
printf("%d %d %d ",E[G[x]].t,x,E[G[x]].t),a[x]=-a[x];
}
if(f) printf("%d ",f),a[f]=-a[f];
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1,x,y;i<n;i++)
scanf("%d%d",&x,&y),addedge(x,y);
a[1]=-a[1];
dfs(1,0);
return 0;
}