#include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=1e6+10;
int u,v,n,cut=0,l=0,r=0;
int b[N],cap[N];
struct Node {
vector<int> childs;
vector<int> child;
int deep;
int c;
int k;
} g[N];
inline bool cmp(Node x,Node y) {
return x.deep>y.deep;
}
inline void dfs(int rt,int fa) {
g[rt].deep=g[fa].deep+1;
for(int i=0; i<g[rt].childs.size(); i++) {
if(g[rt].childs[i]==fa) continue;
g[rt].c++;
g[rt].child.push_back(g[rt].childs[i]);
dfs(g[rt].childs[i],rt);
}
}
inline void add(int x,int y) {
g[x].childs.push_back(y);
}
signed main() {
scanf("%d",&n);
for(int i=1; i<n; i++) {
scanf("%d%d",&u,&v);
g[u].k=u,g[v].k=v;
add(u,v);
add(v,u);
}
dfs(1,0);
for(int i=1; i<=n; i++) b[i]=g[i].deep,cut+=b[i];
if(cut%2==1) {
printf("-1");
return 0;
}
cut/=2;
sort(g+1,g+n+1,cmp);
for(int i=1; i<=n; i++) {
if(l<=r) l+=g[i].deep,cap[g[i].k]=1;
else r+=g[i].deep,cap[g[i].k]=0;
}
if(l==cut&&r==cut) {
for(int i=1; i<=n; i++) printf("%d ",cap[i]);
return 0;
}
printf("-1");
return 0;
}
一遍 dfs,一遍排序 为什么TLE