P1892 [BOI2003]团伙
坑点:
- x和y是朋友,y的敌人不一定是x的敌人,所以不可以把x的敌人和y的敌人合并。
- x和y是敌人,除了y的敌人是x的朋友以外,y的朋友还是x的敌人。
另外注意在合并集合的时候,需要将集合合并到朋友域(1~n)里面来,方便统计。
#include<iostream>
using namespace std;
const int N = 2010;
int p[N];
int n, m;
int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main(){
cin >> n >> m;
for(int i = 1; i <= 2 * n; i ++) p[i] = i;
while(m --){
char op;
int x, y;
cin >> op >> x >> y;
int fx = find(x), fy = find(y);
int ex = find(x + n), ey = find(y + n);
if(op == 'F'){
p[fx] = fy;
//p[ex] = ey; 朋友的敌人不一定是我的敌人
}else{
p[ey] = fx; // 因为只统计每一个点的朋友域
p[ex] = fy;
}
}
int res = 0;
for(int i = 1; i <= n; i ++)
if(p[i] == i) res ++;
cout << res;
return 0;
}