1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
   | #include<iostream> #include<cstdio> using namespace std; const int maxn=4e5+10; int n; int tot,head[maxn],ver[2*maxn],ne[2*maxn]; int si[maxn],d[maxn][2],f[maxn],pre[maxn],maxsize[maxn]; int ans[maxn]; void add(int u,int v) {     ver[++tot]=v;     ne[tot]=head[u];     head[u]=tot; } int dp(int x,int fa) {     si[x]=1;     for(int i=head[x];i;i=ne[i])     {         int to=ver[i];         if(to==fa)continue;         dp(to,x);         si[x]+=si[to];         if(si[to]>si[maxsize[x]])maxsize[x]=to;         int v;         if(si[to]<=n/2)v=si[to];         else v=d[to][0];         if(d[x][0]<v)         {             d[x][1]=d[x][0];             d[x][0]=v;             pre[x]=to;         }         else if(d[x][1]<v)d[x][1]=v;     } } void dfs(int x,int fa) {     ans[x]=1; 	if(si[maxsize[x]]>n/2) ans[x]=(si[maxsize[x]]-d[maxsize[x]][0]<=n/2); 	else if(n-si[x]>n/2) ans[x]=(n-si[x]-f[x]<=n/2); 	for(int i=head[x];i;i=ne[i])     {         int to=ver[i]; 		if(to==fa) continue;         int v; 		if(n-si[x]>n/2)v=f[x]; 		else v=n-si[x]; 		f[to]=max(f[to],v); 		if(pre[x]==to)f[to]=max(f[to],d[x][1]); 		else f[to]=max(f[to],d[x][0]); 		dfs(to,x); 	} } int main() {     cin>>n;     for(int i=1;i<n;i++)     {         int u,v;         cin>>u>>v;         add(u,v);         add(v,u);     }     dp(1,0);     dfs(1,0);     for(int i=1;i<=n;i++)         cout<<ans[i]<<" ";     return 0; }
   |