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