tree
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 822 Accepted Submission(s): 393
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.分析:给你几个数,判断离一个点最近的点有几个,结果与。权值为0代表俩点连接,如果权值均为一则只有一个点离他最近,即它本身。代码:#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<stack> #include<cstdlib> #define mem(x,y) memset(x,y,sizeof(x)) #define SI(x) scanf("%d",&x) #define ST(x,y,z) scanf("%d%d%d",&x,&y,&z) #define O_O(x) while(x--) using namespace std; const int maxn=100010; int father[maxn],tree[maxn]; int n; int find(int x) { if(x!=tree[x]) return find(tree[x]); return x; } void join(int x,int y) { int f1=find(x); int f2=find(y); if(f1!=f2) { tree[f1]=f2; father[f2]+=father[f1]; } } int main() { int T; SI(T); O_O(T) { int u,v,w; SI(n); for(int i=1;i<=n;i++) { father[i]=1; tree[i]=i; } int m=n-1; O_O(m) { ST(u,v,w); if(w==0) join(u,v); } int temp; temp=father[find(1)]; for(int i=2;i<=n;i++) temp^=father[find(i)]; printf("%d\n",temp); } // system("pause"); return 0; }