poj 1182-食物链解题报告

本文深入解析并查集算法处理关系难题的思路与实现细节,通过实例代码展示如何解决复杂关系匹配问题。

链接:http://poj.org/problem?id=1182

并查集的一道经典题目,主要是处理两个之间的关系的时候比较难想,也比较麻烦

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 50005
 4 struct node
 5 {
 6     int p;
 7     int r;
 8 };
 9 node f[N];
10 int n;
11 void init()
12 {
13     int i;
14     for(i=1;i<=n;i++)
15     {
16         f[i].p=i;
17         f[i].r=0;
18     }
19 }
20 int find(int x)
21 {
22     if(f[x].p==x)
23     return x;
24     int temp=f[x].p;
25     f[x].p=find(temp);
26     f[x].r=(f[temp].r+f[x].r)%3;
27     return f[x].p;
28 }
29 void uni(int x,int y,int sx,int sy,int d)
30 {
31     f[sy].p=sx;
32     f[sy].r=(3+(d-1)+f[x].r-f[y].r)%3;
33 }
34 int main()
35 {
36     int d,a,b,m;
37     int i,j,k;
38     scanf("%d%d",&n,&m);
39     init();
40     int num=0;
41     while(m--)
42     {
43         scanf("%d%d%d",&d,&a,&b);
44         if(a>n||b>n)
45         {
46             num++;
47             continue;
48         }
49         int pa=find(a);
50         int pb=find(b);
51         if(pa!=pb)
52         uni(a,b,pa,pb,d);
53         else
54         {
55             if(d==1&&f[a].r!=f[b].r)
56             num++;
57             else if(d==2&&(f[b].r-f[a].r+3)%3!=1)
58             num++;
59         }
60     }
61     printf("%d\n",num);
62     return 0;
63 }

 

转载于:https://www.cnblogs.com/caozhenhai/archive/2012/05/09/2493408.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值