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\in[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\le 50,n\le 10^5,u,v\in[1,n],w\in[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\le 50,n\le 10^5,u,v\in[1,n],w\in[0,1]$
Output
for each test case,you need to print the answer to each point.
in consideration of the large output,imagine $ans_i$ is the answer to point $i$,you only need to output,$ans_1~xor~ans_2~xor~ans_3..~ans_n$.
in consideration of the large output,imagine $ans_i$ is the answer to point $i$,you only need to output,$ans_1~xor~ans_2~xor~ans_3..~ans_n$.
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.
题意:给出几组数据,每组数据有m(1-m)个点,然后给出m-1组两点之间的距离,距离只可能为1或者为0,求出距离每个点最近的点的个数(包括自己本身),然后把这些值异或
#include<stdio.h> #include<string.h> int f[100010],num[100010]; int getf(int v) { if(f[v]==v) return v; f[v]=getf(f[v]); return f[v]; } void merge(int u,int v) { int t1,t2; t1=getf(u); t2=getf(v); if(t1!=t2) f[t1]=t2; } int main() { int n,m,u,v,w; scanf("%d",&n); while(n--) { int s=0; scanf("%d",&m); for(int i=1; i<=m; i++) f[i]=i,num[i]=0; for(int i=1; i<m; i++) { scanf("%d%d%d",&u,&v,&w);//距离为1的点不可能离其他点最近,不予考虑 if(!w) //距离为0的点 { merge(u,v); } } for(int i=1; i<=m; i++) { int p=getf(i); num[p]++; //统计连通点的个数,即距离为0的点 } for(int i=1; i<=m; i++) s^=num[getf(i)]; printf("%d\n",s); } return 0; }