poj 1703 Find them, Catch them(Dsu)

题目链接:http://poj.org/problem?id=1703

用二维数组,第一维记录元素i(f[i][0]),第二维记录与i不在同一集合的元素j(f[i][1])。

初始化f[i][0]=i,f[i][1]=0(表示没有元素);

每次操作时,合并f[a][0]和f[b][1],f[a][1]和f[b][0]。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=100005;
int T,n,m;
int f[maxn][2];

void Make_Set(){
	for(int i=1;i<=n;i++)
		f[i][0]=i,f[i][1]=0;
}

int find(int x){
	return x==f[x][0]?x:f[x][0]=find(f[x][0]);
}

void Union(int a,int b){
	int ra=find(a);
	int rb=find(b);
	if(ra==rb) return ;
	f[ra][0]=rb;
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
#endif
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		Make_Set();
		char ch;
		int a,b;
		while(m--){
			getchar();
			scanf("%c%d%d",&ch,&a,&b);
			int tmpa=f[a][1];
			int tmpb=f[b][1];
			if(ch=='D'){
				if(!tmpa) f[a][1]=tmpa=b;
				if(!tmpb) f[b][1]=tmpb=a;
				Union(a,tmpb),Union(tmpa,b);
			}
			if(ch=='A'){
				if(find(f[a][0])==find(f[b][0])) puts("In the same gang.");
				else if(find(f[a][1])==find(f[b][0])) puts("In different gangs.");
				else puts("Not sure yet.");
			}
		}
	}
	return 0;
}


你可能感兴趣的:(poj 1703 Find them, Catch them(Dsu))