标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 42031 | Accepted: 12923 |
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时会给信息,告诉你哪两个人不是一个帮派的,输入字符A时让你判断两个人之间的关系(是否一帮派等等)
思路:并查集,每个人具体是哪个帮派的人并不知道,所以创建2*N个元素,其中元素x和x+N分别代表一个人x属于帮派1和帮派2。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<algorithm> using namespace std; const int N_MAX = 100000*2+1; int par[N_MAX]; int Rank[N_MAX]; void init(const int &n) { for (int i = 0;i < n;i++) { par[i] = i; Rank[i] = 0; } } int find(const int&x) { if (par[x] == x) return x; else { return par[x] = find(par[x]); } } void unite(int x, int y) { x = find(x); y = find(y); if (x == y)return; if (Rank[x] < Rank[y]) { par[x] = y; } else { par[y] = x; if (Rank[x] == Rank[y])Rank[x]++; } } bool same(const int &x,const int&y) { return find(x) == find(y); } int main() { int T,N,M; cin >> T; while (T--) { scanf("%d%d",&N,&M); init(2*N);//元素x和x+N分别代表元素x分别属于两个帮派 char op;int x, y; getchar();//////!!!!!!!!!!!!!!!!!!千万别忘,不然会影响下面的输入 while(M--) { scanf("%c%d%d",&op,&x, &y); //scanf("%c%d%d%*c", &op, &x, &y); x--;y--; if (op == ‘A‘) {//需要判断两个元素是否属于一个帮派 if (same(x, y))printf("In the same gang.\n");//x,y在同一个帮派 else if (same(x, y + N))printf("In different gangs.\n");//x,y在不同帮派 else printf("Not sure yet.\n"); } else if (op == ‘D‘) {//合并元素的操作,x,y不在同一帮派 unite(x,y+N); unite(x + N, y); } cin.ignore(); } } return 0; }
poj 1703 Find them, Catch them
标签:
原文地址:http://www.cnblogs.com/ZefengYao/p/5906356.html