问题描述:
1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:
我朋友的朋友是我的朋友;
我敌人的敌人也是我的朋友。
两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。
输入格式:
第一行是一个整数N(2<=N<=1000),表示强盗的个数(从1编号到N)。 第二行M(1<=M<=5000),表示关于强盗的信息条数。 以下M行,每行可能是F p q或是E p q(1<=p q<=N),F表示p和q是朋友,E表示p和q是敌人。输入数据保证不会产生信息的矛盾。
输出格式:
只有一行,表示最大可能的团伙数。
输入样例:
6
4
E 1 4
F 3 5
F 4 6
E 1 2
输出样例:
3
#include
#include
#include
#include
using namespace std;
#define ms(a) memset(a,0,sizeof(a))
#define N 5005int parent[N];
//代表朋友
int em[N];
//代表敌人 int get_parent(int x){
int t=x;
if(t!=parent[x])
t=get_parent(parent[x]);
return t;
}void merge(int x,int y){
int tx=get_parent(x);
int ty=get_parent(y);
if(tx!=ty){
parent[tx]=ty;
}
}int main(){
int n,m;
int a,b;
char s;
while(cin>>n){
for(int i=1;
i<=n;
i++){
parent[i]=i;
em[i]=0;
}
cin>>m;
for(int i=1;
i<=m;
i++){
cin>>s>>a>>b;
if(s=='F'){
merge(a,b);
}
else{
if(em[a]){
merge(em[a],b);
}
else{
em[a]=b;
}
if(em[b]){
merge(a,em[b]);
}
else{
em[b]=a;
}
}
}
int sum=0;
for(int i=1;
i<=n;
i++){
if(parent[i]==i){
sum++;
}
}
cout<
【团伙】
推荐阅读
- 九度|最小生成树
- 并查集|[CF938G] Shortest Path Queries
- hdu|【hdu 5354】Bipartite Graph【分治 并查集】
- 数据结构|[codeforces 938G]Shortest Path Queries
- HDU-1213 并查集裸题