tree
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other)
Total Submission(s) : 8 Accepted Submission(s) : 6
Problem Description
There is a tree(the tree is a connected graph which contains
n
points and
Input
the first line contains a number T,means T test cases. for each test case,the first line is a nubmer
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,
Sample Input
1
3
1 2 0
2 3 1
Sample Output
1
in the sample.
ans1=2
ans2=2
ans3=1
2 xor 2 xor 1=1 ,so you need to output 1.
给你n个点的联通,让你找出与每个点的最短连接点,连接点包括它自己,然后将每个点的最短连接点个数进行或非运算
注意如果有多个点之间w都为0,我们均要将其作为一个集合,因此
直接对每个点进行处理,不过我们在rank值时变为1,然后只要当w=0时就进行并查,最后统计所有集合的点然后或非操作
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#define N 100010
using namespace std;
int map[N];
int rank_[N];
int n;
void init(int n)
{
int i;
for(i=1; i<=n; i++)
map[i]=i,rank_[i]=1;
}
int find(int x)
{
if(x!=map[x])
map[x]=find(map[x]);
return map[x];
}
void Union(int x,int y)
{
x=find(x),y=find(y);
if(x!=y)
{
map[x]=y;
rank_[y]+=rank_[x];
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
init(n);
int u,v,w;
int sum=0;
for(int i=1; i<=n-1; i++)
{
scanf("%d%d%d",&u,&v,&w);
if(w==0)
Union(u,v);
}
for(int i=1; i<=n; i++)
{
if(map[i]==i&&rank_[i]%2==1)
sum=rank_[i]^sum;
}
cout<<sum<<endl;
}
return 0;
}