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

Noi2001 食物链(扩展域并查集)

NOI2001|POJ1182食物链[种类并查集 向量]

NOI 2001 食物链 /// 并查集 oj22035

进阶——细赏并查集

带权并查集——食物链

编程算法 - 食物链 并查集 代码(C)