poj1182

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1182相关的知识,希望对你有一定的参考价值。

带权并查集经典,网上题解很多,不多说了

#include<iostream>
#include<cstring>
#include<cstdio>
#define MAXN 50005
using namespace std;
int val[MAXN];//权值 
int F[MAXN];
int find(int x){
    if(F[x]==-1) return x;
    int tmp=find(F[x]);//先进行路径压缩 
    val[x]+=val[F[x]];
    val[x]%=3;
    return F[x]=tmp; 
}
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    memset(F,-1,sizeof(F));
    memset(val,0,sizeof(val));
    int ans=0,op,a,b;
    while(k--){
        scanf("%d%d%d",&op,&a,&b);
        if(a>n||b>n){
            ans++;
            continue;
        }
        //手动合并 
        int t1=find(a);
        int t2=find(b);
        if(t1==t2){//这时就可以判断真假啦 
            if(op==1 && val[a]!=val[b]) ans++;
            if(op==2 && (val[a]+1)%3!=val[b]) ans++;//a吃b的情况a=0 b=1,a=1 b=2,a=2 b=0 
        }
        else {
            if(op==1){//ab同类,a对t1是val[a],b对t2是val[b],可以推出t2对t1是val[a]-val[b] 
                F[t2]=t1;
                val[t2]=(val[a]-val[b]+3)%3;// 方程val[a]-val[b]=val[t2]-val[t1] a=1 b=0 假设t1=0 说明t2=1
                //val[a]-val[b]是a相对比b高的等级,但是a和b实际是相等的,所以t2就比t1高了val[a]-val[b]个等级! 
            }
            else if (op==2){//a吃b
                F[t2]=t1;
                val[t2]=(val[a]-val[b]+1+3)%3; 
            }
        }
    }
    printf("%d
",ans);
    return 0;
}

 

以上是关于poj1182的主要内容,如果未能解决你的问题,请参考以下文章

poj1182 拆点并查集

POJ_1182_并查集

食物链 poj 1182

POJ 1182 食物链

poj1182

poj1182