题目
现在有n个人,他们之间有两种关系:朋友和敌人。我们知道:
- 一个人的朋友的朋友是朋友
- 一个人的敌人的敌人是朋友
现在要对这些人进行组团。两个人在一个团体内当且仅当这两个人是朋友。请求出这些人中最多可能有的团体数。
输入输出格式
输入格式
第一行输入一个整数n代表人数。
第二行输入一个整数m表示接下来要列出m个关系。
接下来m行,每行一个字符opt和两个整数p,q,分别代表关系(朋友或敌人),有关系的两个人之中的第一个人和第二个人。其中opt有两种可能:
- 如果opt为
F
,则表明p和q是朋友。 - 如果opt为
E
,则表明p和q是敌人。
输出格式
一行一个整数代表最多的团体数。
输入输出样例
输入样例
6
4
E 1 4
F 3 5
F 4 6
E 1 2
输出样例
3
代码
#include<iostream>
#include<string>
using namespace std;
int n,m,f[1001],enm[1001],count[1001],ans;
int find(int x){
if(x==f[x]){
return x;
}
f[x]=find(f[x]);
return f[x];
}
void ad(int x,int y){
x=find(x);
y=find(y);
if(x==y){
return;
}
f[y]=x;
return;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
f[i]=i;
}
for(int i=1;i<=m;i++){
int p,q;
char c;
cin>>c>>p>>q;
if(c=='F'){
ad(p,q);
}
else{
if(!enm[p]){
enm[p]=find(q);
}
else{
ad(q,enm[p]);
}
if(!enm[q]){
enm[q]=find(p);
}
else{
ad(p,enm[q]);
}
}
}
for(int i=1;i<=n;i++){
count[find(i)]++;
}
for(int i=1;i<=n;i++){
if(count[i]){
ans++;
}
}
cout<<ans;
return 0;
}