P1892 [BOI2003]团伙

坑点:

  1. x和y是朋友,y的敌人不一定是x的敌人,所以不可以把x的敌人和y的敌人合并。
  2. 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;
}
posted @ 2020-10-29 19:45  yys_c  阅读(68)  评论(0编辑  收藏  举报