并查集 POJ-1703 Find them, Catch them

来源:互联网 发布:网络借贷超市 编辑:程序博客网 时间:2024/06/01 07:38


传送门: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] == n) return n;return par[n] = find_par( par[n] );}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;}


原创粉丝点击