八中跪了……做一发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;
}