您的位置:首页 > 其它

POJ 1703 Find them, Catch them 利用并查集的长度关系(我现在不敢说是不是距离了)

2012-07-26 16:06 525 查看
这道题根同性恋那道题相当像无非就是看他有没有合并过、记录合并之后的那个点的关系罢了。
View Code

#include <stdio.h>
#include <stdlib.h>
int set[100005],num[100006],h[100005];
int find(int x)
{
if(x!=set[x])
{
int y = set[x];
set[x] = find(set[x]);
num[x] = (num[x]+num[y])%2;
}
return set[x];
}
void merge(int x, int y)
{
int a = find(x);
int b = find(y);
if(a!= b)
{
if(h[a]>h[b])
{
set[b] = a;
num[b] = (num[x]-num[y]+1)%2;
}
else
{
set[a] = b;
num[a] = (num[y]-num[x]+1)%2;
if(h[a] == h[b])
h[b]++;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,n,m,a,b;
char order[5];
scanf("%d %d",&n,&m);
for(i = 0;i <= n;i++)
{
set[i] = i;
h[i] = 0;
num[i] = 0;
}
while(m--)
{
scanf("%s",order);
scanf("%d %d",&a,&b);
if(order[0] == 'D')
merge(a,b);
else
{
if(find(a) == find(b))
{
if(num[a]%2 != num[b]%2)
puts("In different gangs.");
else
puts("In the same gang.");
}
else
puts("Not sure yet.");
}
}

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