您的位置:首页 > 其它

poj 1703 Find them, Catch them(Dsu)

2016-02-09 12:12 393 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: