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 }

 

posted @ 2012-05-09 22:22  zhenhai  阅读(154)  评论(0编辑  收藏  举报