Noi2001食物链-并查集

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<algorithm>
 7 #include<cmath>
 8 #include<vector>
 9 #include<queue>
10 #include<set>
11 using namespace std;
12 int par[50001],dis[50001];
13 void get_par(int v){
14     if(par[v]!=v){
15         get_par(par[v]);
16         dis[v]=(dis[par[v]]+dis[v])%3;
17         par[v]=par[par[v]];
18     }
19 }
20 int get_kind(int x,int y){
21     get_par(x);
22     get_par(y);
23     if(par[x]!=par[y]) return -1;
24     int a=(dis[y]-dis[x])%3;
25     if(a<0) a+=3;
26     return a;
27 }
28 void add_relation(int x,int y,int d){
29     get_par(x);
30     int a=(-d+1-dis[x])%3;
31     if(a<0) a+=3;
32     dis[par[x]]=a;
33     par[par[x]]=y;
34     
35 }
36 int main(){
37     int n,k,ans=0;
38     scanf("%d%d",&n,&k);
39     for(int i=1;i<=n;i++) par[i]=i;
40     for(int i=0;i<k;i++){
41         int d,x,y;
42         scanf("%d%d%d",&d,&x,&y);
43         if(x>n||y>n){
44             ans++;
45             continue;
46         }
47         int a=get_kind(x,y);
48         if(a==-1) add_relation(x,y,d);
49         else if(a!=(d-1)) ans++;
50     }
51     printf("%d\n",ans);
52     return 0;
53 }

代码第32、33行的顺序一定不能反!要注意。

posted on 2017-03-06 19:26 学无止境-1980 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/rdzrdz-acm/p/6511508.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值