您的位置:首页 > 其它

并查集 POJ-1703 Find them, Catch them

2017-07-22 14:19 465 查看
传送门:vjudge 或者
原网址

本题与食物连相似 
传送门

题目大意:警察抓捕罪犯,罪犯有两个帮派(龙帮和蛇帮。。。抓罪犯还要分帮派,难道是龙蛇混杂,龙帮不敢抓??), 让你写个程序分辨两个罪犯是不是属于一个帮派,

输入 A 时判断两个罪犯是不是同一个帮派,  输入D 时说明两个罪犯不是同一个帮派的。

AC 代码:

#include <iostream>
#include <cstdio>

using namespace std;

int par[200100];
int Rank[200100];

void init(int n)
{
for(int i=0; i<n; i++)
{
par[i] = i;
Rank[i] = 0;
}
}

int find_par(int n)
{
if(par
== n) return n;
return par
= find_par( par
);
}

void unit_par(int a, int b)
{
a = find_par(a);
b = find_par(b);
if(a == b) return;
if(Rank[a] < Rank[b]) par[a] = b;
else
{
par[b] = a;
if(Rank[b] == Rank[a]) Rank[a]++;
}
}

bool same(int a, int b)
{
return find_par(a) == find_par(b);
}

int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, m;
char ch[10];
int a, b;
scanf("%d%d", &n, &m);
init(n*2);
for(int i=0; i<m; i++)
{
scanf("%s%d%d", ch, &a, &b);
if(ch[0] == 'A')
{
if(same(a,b)) printf("In the same gang.\n");
else if(same(a,b+n) || same(a+n,b)) printf("In different gangs.\n");
else printf("Not sure yet.\n");

}
else
{
unit_par(a, b+n);
unit_par(a+n, b);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息