您的位置:首页 > 其它

poj 1703 - Find them, Catch them(并查集)

2013-10-14 17:17 417 查看
思路:

     只要两者的关系确定了,就将他们加入一个集合中,另外增加一个表示关系的数组flag,来表示该节点与其父节点的关系,0表示是同一类,1表示是不同团伙。

     初始时,集合只有自己一个元素。flag设置为0.

代码如下:

const int M = 100005;
int flag[M], p[M];

int find(int x)
{
int tmp = p[x];
p[x] = (p[x]==x?x:find(p[x]));
flag[x] = (flag[x]==flag[tmp]?0:1);
return p[x];
}
char get_char()
{
char c;
while(1)
{
c = getchar();
if(c=='A'||c=='D') return c;
}
}
int main()
{
int t, n, m, a, b, c, x, y;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
memset(flag,0,sizeof(flag));
for(int i = 0; i <= n; ++i) p[i] = i;
for(int i = 0; i < m; ++i)
{
c = get_char();
scanf("%d %d", &a, &b);
x = find(a);
y = find(b);
if(c=='A')
{
if(x!=y) puts("Not sure yet.");
else if(flag[a]==flag[b]) puts("In the same gang.");
else puts("In different gangs.");
}
else
{
if(x!=y)
{
p[x] = y;
flag[x] = (flag[a]==flag[b]?1:0);
}
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: