标签:
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.
并查集的扩展。
//Asimple #include <iostream> #include <cstdio> using namespace std; const int maxn = 100010; int fa[maxn];//存贮根 fa[a] 存 a 的根 int r[maxn];// 存贮 fa[a] 与 a 的关系 // 0 则不在一个 gang 里, 1 表示在一个 gang 里 int T, n, m, a, b; char ch; void make_set(int n)// 保存根 { for(int i=1; i<=n; i++) { fa[i] = i ;// i 的根是 fa[i] r[i] = 1 ;// 在同一个 gang 里 } } int find_set(int a)// 找根节点 { if( a == fa[a] ) return a; else { int temp = fa[a] ; fa[a] = find_set(fa[a]); r[a] = (r[temp] + r[a] + 1 ) % 2 ; } return fa[a] ; } void union_set(int a, int b) { int faa = find_set(a);//找根节点 int fbb = find_set(b); if( faa != fbb )//两个根节点不同,就将其联合起来 { fa[faa] = fbb ; r[faa] = ( r[a] + r[b] ) % 2 ;//更新状态 } } int main() { scanf("%d",&T); while( T -- ) { scanf("%d%d",&n,&m); make_set(n); while( m-- ) { getchar(); scanf("%c%d%d",&ch,&a,&b); if( ch == ‘A‘ ) { if( find_set(a) == find_set(b) ) { if((r[a]+r[b])%2==0) cout << "In the same gang." << endl ; else cout << "In different gangs." << endl ; } else cout << "Not sure yet." << endl ; } else union_set(a,b); } } return 0; }
ACM题目————Find them, Catch them
标签:
原文地址:http://www.cnblogs.com/Asimple/p/5512368.html