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
| #include<cstdio> #include<vector> #include<algorithm> using namespace std; const int N=100010,FSIZE=1<<26; int w,tn,n,sz[N],f[N],s[N][2],ans[N]; vector<int> t[N]; char BuF[FSIZE],*InF=BuF; template<typename T>void read(T &x){ for(;48>*InF||*InF>57;++InF); for(x=0;47<*InF&&*InF<58;x=x*10+(*InF++^48)); } void pre(int x,int fa){ sz[x]=1; s[x][0]=s[x][1]=0; for(int i:t[x]) if(i!=fa){ pre(i,x); sz[x]+=sz[i]; if(sz[i]>sz[s[x][0]]){ s[x][1]=s[x][0]; s[x][0]=i; }else if(sz[i]>sz[s[x][1]]) s[x][1]=i; } } void dfs(int x,int fa){ for(int i:t[x]) if(i!=fa) dfs(i,x); if(f[s[x][0]]+1<=sz[x]-sz[s[x][0]]-1) f[x]=~sz[x]&1; else f[x]=f[s[x][0]]+1-(sz[x]-sz[s[x][0]]-1); } void get(int x,int fa,int up,int dp){ int mx=sz[s[x][0]]>sz[up]?s[x][0]:up; if(f[mx]+1<=n-dp-sz[mx]) ans[x]=~(n-dp)&1; else ans[x]=0; for(int i:t[x]) if(i!=fa) get(i,x,mx==i?sz[s[x][1]]>sz[up]?s[x][1]:up:mx,dp+1); } void work(){ read(n); for(int i=1;i<=n;++i) t[i].clear(); for(int i=1,x,y;i<n;++i){ read(x);read(y); t[x].push_back(y); t[y].push_back(x); } pre(1,0); dfs(1,0); if(w==3){ printf("%d\n",!f[1]); return; } get(1,0,0,1); for(int i=1;i<=n;++i) printf("%d",ans[i]); puts(""); } int main(){ fread(BuF,1,FSIZE,stdin); read(w); f[0]=sz[0]=0xf0000000; for(read(tn);tn--;work()); return(0); }
|