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; }
|