标签:poj
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 30702 | Accepted: 9447 |
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.
题意:
城市里面有2个犯罪团伙,罪犯都属于这两个团伙。现在给你2个罪犯,判断他们是不是一个犯罪团伙。如果当前关系不确定,就输出not sure yet.
并查集的应用,很A bug‘s life基本一样。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<cmath> using namespace std; const int maxn = 100005; int cas, n, m; int parent[maxn], relation[maxn]; char str[2]; int a, b; int find(int x) { if (x == parent[x]) return x; int px = find(parent[x]); relation[x] = ((relation[x] + relation[parent[x]])%2); return parent[x] = px; } void init() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { parent[i] = i; relation[i] = 0; } } void kruskal(int a, int b) { if(n==2 && str[0]=='A') //题意是说只有两个人时,应该是属于不同的团伙。。但是数据没有这个。。就算不加也A了、、 printf("In different gangs.\n"); else { int pa = find(a); int pb = find(b); if (pa != pb) { if (str[0] == 'D') { parent[pa] = pb; if (relation[b] == 0) relation[pa] = 1 - relation[a];//表示不同 else relation[pa] = relation[a];//相同 } else printf("Not sure yet.\n"); } else { if (str[0] == 'A') { if (relation[a] != relation[b]) printf("In different gangs.\n"); else printf("In the same gang.\n"); } } } } int main() { scanf("%d", &cas); while (cas--) { init(); while (m--) { scanf("%s%d%d", str, &a, &b); kruskal(a, b); } } return 0; }
POJ 1703:Find them, Catch them(带权的并查集)
标签:poj
原文地址:http://blog.csdn.net/u013487051/article/details/38031803