当前位置: 代码迷 >> 综合 >> POJ--1703--Find them, Catch them--并查集
  详细解决方案

POJ--1703--Find them, Catch them--并查集

热度:47   发布时间:2023-12-12 06:38:06.0

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

警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人。该城有N个罪犯,编号从1至N(N<=100000。将有M(M<=100000)次操作。
D a b 表示a、b是不同帮派
A a b 询问a、b关系

Input

多组数据。第一行是数据总数 T (1 <= T <= 20)每组数据第一行是N、M,接下来M行是操作

Output

对于每一个A操作,回答"In the same gang."或"In different gangs." 或"Not sure yet."

Sample Input
1
5 5
A 1 2
D 1 2
A 1 2
D 2 4
A 1 4
Sample Output
Not sure yet.
In different gangs.
In the same gang.

思路:并查集模板https://blog.csdn.net/queque_heiya/article/details/103940072

D a b 表示a、b是不同帮派,分别unite(a+n,b),unite(a,b+n);

注意:初始化init(2*n+10),用cin输入防止时间超时.

//并查集模型抽象 
#include<iostream>
using namespace std;
#include<cstring>
#include<algorithm>
const int MAX_E=100000*2+10;
int par[MAX_E];
void init(int n){for(int i=0;i<n;i++){par[i]=i;}
}
int find(int x){if(par[x]==x)return x;else return par[x]=find(par[x]);
}
void unite(int x,int y){x=find(x);y=find(y);if(x==y)return ;par[x]=y; 
}
bool same(int x,int y){//x,y在同一个集合里面 return find(x)==find(y);
}
int main(){int t;char ch[2];//用单一字符出现问题 cin>>t;while(t--){int n,m,a,b;scanf("%d%d",&n,&m);init(2*n+10);//初始化for(int i=0;i<m;i++){//可以进行的操作scanf("%s %d %d",ch,&a,&b);if(ch[0]=='A'){if(same(a,b))cout<<"In the same gang."<<endl;else if(same(a,b+n))cout<<"In different gangs."<<endl;elsecout<<"Not sure yet."<<endl;}else if(ch[0]=='D'){unite(a+n,b);//分开类别 unite(a,b+n); }}}
} 

 

  相关解决方案