POJ1182 食物链

扩展域并查集

分为同类域,捕食域,天敌域

#include<cstdio>
using namespace std;
const int maxn = 5e4 + 5;
int prt[3*maxn];
int getpa(int x)
{
    return x == prt[x] ? x : prt[x] = getpa(prt[x]);
}
int main()
{
    int n, k, op, x, y, ans = 0;
    scanf("%d%d",&n,&k);
    for(int i = 1; i <= 3*n; i++) prt[i] = i;
    for(int i = 1; i <= k; i++){
        scanf("%d%d%d",&op,&x,&y);
        if(x > n || y > n){
            ans++;
            continue;
        }
        if(op == 1){
            if(getpa(x) == getpa(y+n) || getpa(x+n) == getpa(y) || getpa(x+2*n) == getpa(y) || getpa(x) == getpa(y+2*n)){
                ans++;
                continue;
            }
            prt[getpa(y)] = getpa(x);
            prt[getpa(y+n)] = getpa(x+n);
            prt[getpa(y+2*n)] = getpa(x+2*n);
        }
        else{
            if(getpa(x) == getpa(y) || getpa(x) == getpa(y+n)){
                ans++;
                continue;
            }
            prt[getpa(x+n)] = getpa(y);
            prt[getpa(x+2*n)] = getpa(y+n);
            prt[getpa(x)] = getpa(y+2*n);
        }
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/kkjy_00/article/details/87465996