Noi2001食物链-并查集
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Noi2001食物链-并查集相关的知识,希望对你有一定的参考价值。
并查集当par[a]==par[b]时就不需要处理合并(a,b)的操作了。
下面附标程:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 int ans,n,k; 7 struct st{ 8 int par,len; 9 }; 10 int len[50001],par[50001]; 11 void init() 12 { 13 for(int i=1;i<=n;i++){ 14 par[i]=i; 15 } 16 } 17 st get_par(int v){ 18 if(par[v]==v){ 19 return ((st){v,len[v]}); 20 } 21 st tmp=get_par(par[v]); 22 tmp.len=(tmp.len+len[v])%3; 23 par[v]=tmp.par; 24 len[v]=tmp.len; 25 return tmp; 26 } 27 28 bool check(int d,int a,int b){ 29 if(a>n||b>n) return false; 30 if(d==2&&a==b) return false; 31 if(d==1){ 32 st tmp1=get_par(a); 33 st tmp2=get_par(b); 34 if(tmp1.par==tmp2.par){ 35 if(tmp1.len==tmp2.len) return true; 36 return false; 37 } 38 par[tmp1.par]=tmp2.par; 39 len[tmp1.par]=tmp2.len-tmp1.len; 40 while(len[tmp1.par]<0){len[tmp1.par]+=3;} 41 return true; 42 } 43 if(d==2){ 44 st tmp1=get_par(a); 45 st tmp2=get_par(b); 46 if(tmp1.par==tmp2.par){ 47 if(tmp1.len==((tmp2.len+1)%3)) return true; 48 return false; 49 } 50 par[tmp1.par]=tmp2.par; 51 len[tmp1.par]=tmp2.len+1-tmp1.len; 52 while(len[tmp1.par]<0){len[tmp1.par]+=3;} 53 len[tmp1.par]=len[tmp1.par]%3; 54 return true; 55 } 56 return true; 57 } 58 59 int main(){ 60 scanf("%d %d",&n,&k); 61 int d,a,b; 62 init(); 63 for(int i=0;i<k;i++){ 64 scanf("%d %d %d",&d,&a,&b); 65 if(check(d,a,b)==false) ans++; 66 } 67 printf("%d\n",ans); 68 69 return 0; 70 }
以上是关于Noi2001食物链-并查集的主要内容,如果未能解决你的问题,请参考以下文章