bestcoder #68 A(并查集)

每次都是在最后十几分钟才想出来。。并不能交了T_T

w是0的话merge(u,v)

ans[i]就是i所在集合的元素个数

#include"cstdio"
#include"queue"
#include"cmath"
#include"stack"
#include"iostream"
#include"algorithm"
#include"cstring"
#include"queue"
#include"map"
#include"vector"
#define ll long long

using namespace std;
const int MAXN = 100500;
const int MAXE = 200500;
const int INF = 0x3f3f3f;

int f[MAXN],sum[MAXN];

int fa(int x){
    return x==f[x]?x:f[x]=fa(f[x]);
}

void merge(int a,int b){
    a=fa(a);
    b=fa(b);
    f[a]=b;
}

int main(){
    //freopen("in.txt","r",stdin);
    int n,T;scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) f[i]=i;
        memset(sum,0,sizeof(sum));
        for(int i=1;i<n;i++){
            int u,v,w;scanf("%d%d%d",&u,&v,&w);
            if(!w) merge(u,v);
        }
        for(int i=1;i<=n;i++) sum[fa(i)]++;
        int ans,flag=0;
        for(int i=1;i<=n;i++){
            if(flag) ans^=sum[fa(i)];
            else ans=sum[fa(i)],flag=1;
        }
        cout<<ans<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/luxiaoming/p/5095318.html