Description
Input
Output
Sample Input
1 5 5 A 1 2 D 1 2 A 1 2 D 2 4 A 1 4
Sample Output
Not sure yet. In different gangs. In the same gang.
题意:有两个犯罪团伙,给你n个罪犯的信息,D x y表示x和y不是同一个团伙的,A x y表示询问x和y是否是同一个团伙或者不能确定。
题解:参考了《挑战程序设计竞赛》上面的例题解法,很不错!和poj1128有异曲同工之妙!用并查集,x表示x在a团伙,x+n表示x在b团伙,D x y就合并x,y+n和x+n,y。查询时如果x,y或者x+n,y+n在一起,就是一个团伙的,如果x,y+n或者x+n,y在一起就不是一个团伙的,否则无法确定。这方法不错,感觉比网上位运算类别偏移好理解多了,也好写。
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <list>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <limits>
#include <new>
#include <utility>
#include <iterator>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <ctime>
using namespace std;
const int maxn = 100010;
int f[maxn*2];
int Find(int x)
{
return x == f[x] ? x : (f[x] = Find(f[x]));
}
void join(int x, int y)
{
int fx = Find(x), fy = Find(y);
f[fx] = fy;
}
int main()
{
int T;
cin >> T;
while (T--)
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= 2*n; ++i)
f[i] = i;
char s[5];
while (m--)
{
int x, y;
scanf("%s%d%d", s, &x, &y);
if (s[0] == 'D')
{
join(x, y+n);
join(x+n, y);
}
else
{
if (Find(x) == Find(y) || Find(x+n) == Find(y+n))
printf("In the same gang.\n");
else
if (Find(x) == Find(y+n) || Find(x+n) == Find(y))
printf("In different gangs.\n");
else
printf("Not sure yet.\n");
}
}
}
return 0;
}
版权声明:本文为博主原创文章,转载请注明出处。
poj1703(Find them, Catch them)并查集
原文地址:http://blog.csdn.net/god_weiyang/article/details/47754845