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;
}