每次都是在最后十几分钟才想出来。。并不能交了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; }
原文:http://www.cnblogs.com/luxiaoming/p/5095318.html