-
K - Find them, Catch them
- POJ - 1703
- 题意:
- 警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人。该城有N个罪犯,编号从1至N(N<=100000。将有M(M<=100000)次操作。
D a b 表示a、b是不同帮派
A a b 询问a、b关系 - 思路:建立两个并查集 其中一个说明他们之间有关系,另一个说明他们有关系切能明确的分帮派。
- 则查询时按照逻辑就会分为1.同帮2.异帮3.无关系
-
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; int fa[1000555]; int pre[1000555],twopre[1005550]; int fond1(int x) { return x==pre[x]?x:pre[x]=fond1(pre[x]); } int fond2(int x) { return x==twopre[x]?x:twopre[x]=fond2(twopre[x]); } void unin1(int x,int y) { pre[fond1(x)]=fond1(y); } void unin2(int x,int y) { twopre[fond2(x)]=fond2(y); } int main() { int t,n,m,a,b; char str; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { fa[i]=0; pre[i]=i; twopre[i]=i; } while(m--) { getchar(); scanf("%s%d%d",&str,&a,&b); if(str=='D') { if(fa[a]!=0) { unin1(b,fa[a]); } if(fa[b]!=0) { unin1(a,fa[b]); } fa[a]=b; fa[b]=a; unin2(a,b); } else { if(fond1(a)==fond1(b))printf("In the same gang.\n"); else if(fond2(a)==fond2(b))printf("In different gangs.\n"); else printf("Not sure yet.\n"); } } } return 0; }
K - Find them, Catch them -制约关系并查集-
最新推荐文章于 2020-08-08 21:59:43 发布