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的主要内容,如果未能解决你的问题,请参考以下文章