您的位置:首页 > 其它

HDU 5606 tree

2016-01-15 16:25 337 查看
一道并查集,去掉权值为1的边,问联通块中点的个数

#include <cstdio>
const int MAXN = 100005;

int fa[MAXN], num[MAXN];

int find(int n)
{
if(fa
!= n)
fa
= find(fa
);
return fa
;
}

int main()
{
int T;
scanf("%d", &T);

while(T--)
{
int n, a, b, v;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
fa[i] = i, num[i] = 1;

for(int i = 1; i < n; i++)
{
scanf("%d%d%d", &a, &b, &v);
if(v == 1) continue;
int x = find(a), y = find(b);
if(x != y)
fa[x] = y, num[y] += num[x];
}

int ans = 0;
for(int i = 1; i <= n; i++)
ans ^= num[find(i)];

printf("%d\n", ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: