BestCoder Round #68 (div.1) A 并查集

来源:互联网 发布:淘宝期刊 编辑:程序博客网 时间:2024/05/17 06:02

八中跪了……做一发BC,发现只会AB俩题QAQ。。。
将边权为0的边连接的点合并,最后形成的联通块大小就是每个点的答案。

#include<iostream>#include<cstdio>using namespace std;int T,n,f[100005],size[100005];int ans;inline int read(){    int a=0,f=1; char c=getchar();    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}    return a*f;}inline int find(int x){    return f[x]==x?x:f[x]=find(f[x]);}inline void un(int p,int q){    f[p]=q;    size[q]+=size[p];}int main(){    T=read();    while (T--)    {        n=read();        for (int i=1;i<=n;i++) f[i]=i,size[i]=1;        for (int i=1;i<n;i++)        {            int u=read(),v=read(),w=read();            if (w==0)            {                int p=find(u),q=find(v);                un(p,q);            }        }        ans=size[find(1)];        for (int i=2;i<=n;i++) ans^=size[find(i)];        printf("%d\n",ans);    }    return 0;}
0 0