tree
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 180 Accepted Submission(s): 95
Problem Description
There is a tree(the tree is a connected graph which contains
n
points and
n−1
edges),the points are labeled from 1 to
n
,which edge has a weight from 0 to 1,for every point
i∈[1,n]
,you should find the number of the points which are closest to it,the clostest points can contain
i
itself.
Input
the first line contains a number T,means T test cases.
for each test case,the first line is a nubmer n ,means the number of the points,next n-1 lines,each line contains three numbers u,v,w ,which shows an edge and its weight.
T≤50,n≤105,u,v∈[1,n],w∈[0,1]
for each test case,the first line is a nubmer n ,means the number of the points,next n-1 lines,each line contains three numbers u,v,w ,which shows an edge and its weight.
T≤50,n≤105,u,v∈[1,n],w∈[0,1]
Output
for each test case,you need to print the answer to each point.
in consideration of the large output,imagine ansi is the answer to point i ,you only need to output, ans1 xor ans2 xor ans3.. ansn .
in consideration of the large output,imagine ansi is the answer to point i ,you only need to output, ans1 xor ans2 xor ans3.. ansn .
Sample Input
1 3 1 2 0 2 3 1
Sample Output
1 in the sample. $ans_1=2$ $ans_2=2$ $ans_3=1$ $2~xor~2~xor~1=1$,so you need to output 1.#include<stdio.h> #include<string.h> #include<algorithm> #define N 100010 using namespace std; int a[N]; int b[N]; int find(int x) { return a[x]==x?x:find(a[x]); } int judge(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) { a[fy]=fx; b[fx]+=b[fy]; } } int main() { int t,n,i,j; int u,v,w; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) { a[i]=i; b[i]=1; vis[i]=0; } for(i=1;i<n;i++) { scanf("%d%d%d",&u,&v,&w); if(w==0) judge(u,v); } int sum=0; for(i=1;i<=n;i++) sum^=b[a[i]]; if(n==1) printf("1\n"); else printf("%d\n",sum); } return 0; }