zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    完美解决php无法上传大文件分享
    完美解决php无法上传大文件问题
    完美解决php无法上传大文件思路
    完美解决php无法上传大文件功能
    IfcRightCircularCylinder
    IfcRightCircularCone
    IfcRectangularPyramid
    IfcBlock
    IfcCsgPrimitive3D
    IfcReparametrisedCompositeCurveSegment
  • 原文地址:https://www.cnblogs.com/zsben991126/p/9823365.html
Copyright © 2011-2022 走看看