3034: 【普及+/提高】【P1892】团伙
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:0
解决:0
题目描述
现在有 个人,他们之间有两种关系:朋友和敌人。我们知道:
- 一个人的朋友的朋友是朋友
- 一个人的敌人的敌人是朋友
现在要对这些人进行组团。两个人在一个团体内当且仅当这两个人是朋友。请求出这些人中最多可能有的团体数。
输入
第一行输入一个整数 代表人数。
第二行输入一个整数 表示接下来要列出 个关系。
接下来 行,每行一个字符 和两个整数 ,分别代表关系(朋友或敌人),有关系的两个人之中的第一个人和第二个人。其中 有两种可能:
-
如果 为
F,则表明 和 是朋友。 -
如果 为
E,则表明 和 是敌人。
输出
一行一个整数代表最多的团体数。
样例输入 复制
6
4
E 1 4
F 3 5
F 4 6
E 1 2
样例输出 复制
3
提示
对于 的数据,,,。
#include<bits/stdc++.h>
using namespace std;
int f[2005];
int find(int x) {
if (f[x] != x ) f[x] = find(f[x]);
return f[x];
}
int main(){
int n,m,p,q,ans=0;
char opt;
cin >> n >> m;
for (int i = 1; i <= 2*n ; i++) f[i] = i;
for (int i = 0; i < m; i++) {
cin >> opt >> p >> q;
int t1=find(p), t2=find(q);
if (opt == 'F' ) {
f[t1] = t2;
}else {
int t3=find(p+n),t4=find(q+n);
f[t3] = t2;
f[t4] = t1;
}
}
for (int i = 1; i <=n ; i++) {
if (i == find(i)) ans++;
}
cout << ans;
return 0;
}