Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1897 Accepted Submission(s): 807 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.
Output for each test case,you need to print the answer to each point.
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.
Source
Recommend hujie | We have carefully selected several similar problems for you: 6460 6459 6458 6457 6456 |
题目大意:给你N个点,给你N-1条边,每条边的长度是0或1,然后求出每个点距离最近的点的数目,也就是把长度为0的并起来,还有自己到自己的距离也是0,所以每个点距离最近的点的数目最少是1,最后把每个点的最近的点的数目去异或运算就行了,
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int pre[1000003];
int num[1000003];
int find(int x)
{
return x==pre[x]?x:pre[x]=find(pre[x] );
}
void bind(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b)
{
pre[a]=b;
num[b]+=num[a];
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=100003;i++)
pre[i]=i,num[i]=1;
for(int i=1; i<n; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(c==0)
{
bind(a,b);
}
}
int ans=0;
for(int i=1; i<=n; i++)
{
ans^=num[find(i)];
}
printf("%d\n",ans);
}
return 0;
}