hdu 5606

来源:互联网 发布:ise软件 编辑:程序博客网 时间:2024/06/06 06:49

#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;const int maxn  = 1e5+10;int f[maxn];int flag[maxn];int find(int x){    return x==f[x]?x:f[x] = find(f[x]);}void unit(int x,int y){    int bossx = find(x);    int bossy = find(y);    if(bossx!=bossy)    {        f[bossx]=bossy;    }}int main(){    int T;    scanf("%d",&T);    while(T--)    {        int n;        scanf("%d",&n);        int x,y,z;        for(int i= 1;i<=n;i++)            f[i] = i;        for(int i =1 ; i<n; i++)        {              scanf("%d%d%d",&x,&y,&z);            if(z==0)            {                unit(x,y);            }        }        memset(flag,0,sizeof(flag));        for(int i = 1; i<=n; i++)        {            f[i] = find(i);            flag[f[i]]++;        }        int ans = 0;        for(int i =1; i<=n; i++)        {             ans = flag[f[i]]^ans;        }        printf("%d\n",ans);    }    return 0 ;}
去掉边值为一的边,计算出每个点所在联通图里的点的总个数就是离他最近的点
tree

 
] Accepts: 143
 
 Submissions: 807
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
有一个树(nn个点, n-1n1条边的联通图),点标号从11~nn,树的边权是0011.求离每个点最近的点个数(包括自己).
输入描述
第一行一个数字TT,表示TT组数据.对于每组数据,第一行是一个nn,表示点个数,接下来n-1n1,每行三个整数u,v,wu,v,w,表示一条边连接的两个点和边权.T = 50,1 \leq n \leq 100000, 1 \leq u,v \leq n,0 \leq w \leq 1T=50,1n100000,1u,vn,0w1.
输出描述
对于每组数据,输出答案.考虑到输出规模过大,设ans_iansi表示第ii个点的答案.你只需输出ans_1 \ xor \ ans_2 \ xor \ ans_3.. \ xor \ ans_nans1 xor ans2 xor ans3.. xor ansn即可.
输入样例
131 2 02 3 1
输出样例
1
Hint
ans_1 = 2ans1=2ans_2 = 2ans2=2ans_3 = 1ans3=12 \ xor \ 2 \ xor \ 1=12 xor 2 xor 1=1, 因此输出11.

0 0
原创粉丝点击