您的位置:首页 > 其它

POJ 1703 Find them, Catch them

2016-02-16 09:26 218 查看
又是没学过的。。。。。。。种类并查集

其实就是维护每个点到当前集的根节点的距离的奇偶性。

距离为奇代表和根不同种类,为偶代表和根同种类。

find和merge的时候维护一下就好了。

但是我觉得这题有离线做法啊………………

先把图建出来,然后黑白染色,再跑一遍,用并查集维护连通性,两点不连通就是not sure,连通就用颜色判断一下。结果WA掉了,不知为何。

唉……

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100000+5;
int pa
,dis
;
int find(int x){
if(x==pa[x])return x;
int tmp=find(pa[x]);
dis[x]=(dis[x]+dis[pa[x]])&1;
return pa[x]=tmp;
}
void merge(int u,int v){
int x=find(u),y=find(v);
if(x!=y){
pa[x]=y;
dis[x]=(dis[u]+dis[v]+1)&1;
}
}
int main(){
//freopen("a.in","r",stdin);
int T;scanf("%d",&T);
while(T--){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)pa[i]=i,dis[i]=0;
char opt[5];int u,v;
while(m--){
scanf("%s%d%d",opt,&u,&v);
if(opt[0]=='D')merge(u,v);
else{
if(find(u)!=find(v))puts("Not sure yet.");
else if(dis[u]!=dis[v])
puts("In different gangs.");
else puts("In the same gang.");
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: