码迷,mamicode.com
首页 > 其他好文 > 详细

poj1182

时间:2018-10-20 23:51:21      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:space   clu   define   mes   using   ret   else   +=   ring   

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

#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\n",ans);
    return 0;
}

 

poj1182

标签:space   clu   define   mes   using   ret   else   +=   ring   

原文地址:https://www.cnblogs.com/zsben991126/p/9823365.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!