题意:在这个城市里有2个黑帮团伙,现在给出N个人,M条信息
输入D x y代表x于y不在一个团伙里
输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里
分析:虽说是并查集的题,但又有所不同,
本题给出的信息为x,y不在一个团伙,而并查集确定的是关于有关系的操作
假设x与x+N不在一个团伙,y与y+N不在一个团伙,又x与y不在一个团伙,
一共只有2个黑帮团伙,所以x与y+N在一个团伙,y与x+N在一个团伙,
这样就可以将无关系的信息,转化为有关系,再用并查集即可,
但是若x与y不在一个相同的团伙,得确定他们关系无法确定还是确定不在一个团伙
同理可以判断x与y+N的关系和y与x+N的关系即可
#include<stdio.h> #define M 200000 int f[M+5]; int find(int x) { if(x!=f[x]) f[x]=find(f[x]); return f[x]; } void mix(int a,int b) { a=find(a); b=find(b); if(a!=b) f[a]=b; } int judge(int a,int b) { a=find(a); b=find(b); if(a!=b) return 0; return 1; } int main() { int T,n,m,i,a,b; char c; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); getchar(); for(i=1;i<=n*2;i++) f[i]=i; for(i=1;i<=m;i++){ scanf("%c%d%d",&c,&a,&b); getchar(); if(c=='D'){ mix(a,b+n); //a与b+n在一个团伙 mix(b,a+n); //b与a+n在一个团伙 } else if(c=='A'){ if(judge(a,b)) printf("In the same gang.\n"); else if(judge(a,b+n)||judge(b,a+n)) //若不在同一团伙,得判断是否无法确定关系 printf("In different gangs.\n"); else printf("Not sure yet.\n"); } } } return 0; }
poj 1703 Find them, Catch them (并查集)
原文地址:http://blog.csdn.net/acm_code/article/details/41007069