There is a tree(the tree is a connected graph which contains nn points and n-1n−1 edges),the points are labeled from 1 to nn,which edge has a weight from 0 to 1,for every point i\in[1,n]i∈[1,n],you should find the number of the points which are closest to it,the clostest points can contain ii itself.
the first line contains a number T,means T test cases.
for each test case,the first line is a nubmer nn,means the number of the points,next n-1 lines,each line contains three numbers u,v,wu,v,w,which shows an edge and its weight.
T\le 50,n\le 10^5,u,v\in[1,n],w\in[0,1]T≤50,n≤105,u,v∈[1,n],w∈[0,1]
for each test case,you need to print the answer to each point.
in consideration of the large output,imagine ans_iansi is the answer to point ii,you only need to output,ans_1~xor~ans_2~xor~ans_3..~ans_nans1 xor ans2 xor ans3.. ansn.
1 3 1 2 0 2 3 1
1 in the sample. ans_1=2ans1=2 ans_2=2ans2=2 ans_3=1ans3=1 2~xor~2~xor~1=12 xor 2 xor 1=1,so you need to output 1
.
直接用并查集合并,最后直接求解即可。
#include<map> #include<stack> #include<queue> #include<cmath> #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<functional> using namespace std; typedef long long LL; const int maxn = 1e5 + 10; int T, n, m, fa[maxn], x, y, fx, fy, z, ans[maxn]; int get(int x) { if (fa[x] != x) fa[x] = get(fa[x]); return fa[x]; } int main() { scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) fa[i] = i, ans[i] = 0; for (int i = 1; i < n; i++) { scanf("%d%d%d", &x, &y, &z); if (z) continue; fx = get(x); fy = get(y); if (fx == fy) continue; if (fx > fy) swap(fx, fy); fa[fy] = fx; } int t = 0; for (int i = 1; i <= n; i++) ans[get(i)]++; for (int i = 1; i <= n; i++) if (ans[i] & 1) t ^= ans[i]; printf("%d\n", t); } return 0; }