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
| #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define fst first #define snd second using namespace std; typedef pair<int, int> pii; const int N = 100010, INF = 0x3f3f3f3f; int W, T; int n, ans[N], dep[N]; vector<int> e[N]; pii f[2][N], a[N];
template<typename T> inline T Max(const T &x, const T &y) { return x > y ? x : y; } inline bool operator<(const pii &x, const pii &y) { return x.fst == y.fst ? x.snd > y.snd : x.fst < y.fst; } void dfs1(int u, int ff) { a[u].fst = 1, dep[u] = dep[ff] + 1; for(auto v : e[u]) if(v ^ ff) { dfs1(v, u), a[u].fst += a[v].fst; if(f[1][u] < a[v]) f[1][u] = a[v]; if(f[1][u] > f[0][u]) swap(f[1][u], f[0][u]); } if(f[0][u].fst) { if(a[u].fst - f[0][u].fst - 1 >= f[0][u].snd + 1) a[u].snd = (a[u].fst - 1) & 1; else a[u].snd = f[0][u].snd + 1 - (a[u].fst - f[0][u].fst - 1); } else a[u].snd = 0; } void dfs2(int u, int ff, pii x) { pii U = Max(x, f[0][u]); int sz = n - dep[u] + 1; if(U.fst) { if(sz - U.fst - 1 >= U.snd + 1) ans[u] = (sz - 1) & 1; else ans[u] = U.snd + 1 - (sz - U.fst - 1); } for(auto v : e[u]) if(v ^ ff) { if(f[0][u] == a[v]) dfs2(v, u, Max(x, f[1][u])); else dfs2(v, u, Max(x, f[0][u])); } } int main() { scanf("%d%d", &W, &T); for(; T; --T) { scanf("%d", &n); for(int i = 1; i <= n; i++) e[i].clear(), f[0][i] = f[1][i] = a[i] = mp(0, INF); for(int i = 1, x, y; i < n; i++) scanf("%d%d", &x, &y), e[x].pb(y), e[y].pb(x); dfs1(1, 0), dfs2(1, 0, mp(0, INF)); if(W == 3) printf("%d", ans[1] == 0); else for(int i = 1; i <= n; i++) printf("%d", ans[i] == 0); puts(""); } return 0; }
|