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

Noi2001食物链-并查集

时间:2017-03-06 20:32:33      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:using   iostream   space   处理   get   ios   i++   log   algo   

并查集当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食物链-并查集

标签:using   iostream   space   处理   get   ios   i++   log   algo   

原文地址:http://www.cnblogs.com/rdzrdz-acm/p/6511508.html

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