poj 1182 食物链

题意:

中文题面。

思路:

因为是环形关系,所以每个就用3个关系表示:

(x,y) (x+n,y+n) (x+2*n,y+2*n) 表示同类

(x,y+n) (x+n,y+2*n) (x+2*n,y+n) 表示x吃y

其余的,判断一个有无矛盾就行了。

坑:

无。。。。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 const int N = 50005;
 5 
 6 int par[N * 3];
 7 int ran[N * 3];
 8 
 9 void init(int n)
10 {
11     for (int i = 0;i <= n * 3;i++)
12     {
13         par[i] = i;
14         ran[i] = 0;
15     }
16 }
17 
18 int fin(int x)
19 {
20     if (x == par[x]) return x;
21     else return par[x] = fin(par[x]);
22 }
23 
24 void unit(int x,int y)
25 {
26     x = fin(x);
27     y = fin(y);
28 
29     if (x == y) return;
30 
31     if (ran[x] < ran[y]) par[x] = y;
32     else
33     {
34         par[y] = x;
35         if (ran[x] == ran[y]) ran[x]++;
36     }
37 }
38 
39 int main()
40 {
41     int n,k;
42 
43     scanf("%d%d",&n,&k);
44 
45     init(n);
46 
47     int ans = 0;
48 
49     for (int i = 0;i < k;i++)
50     {
51         int op,x,y;
52 
53         scanf("%d%d%d",&op,&x,&y);
54 
55         if (x > n || y > n)
56         {
57             ans++;
58             continue;
59         }
60 
61         if (op == 1)
62         {
63             if (fin(x) == fin(y+n) || fin(x+n) == fin(y)) ans++;
64             else
65             {
66                 unit(x,y);
67                 unit(x+n,y+n);
68                 unit(x+2*n,y+2*n);
69             }
70         }
71 
72         if (op == 2)
73         {
74             if (x == y) ans++;
75             else if (fin(x) == fin(y) || fin(y) == fin(x+n)) ans++;
76             else
77             {
78                 unit(x,y+n);
79                 unit(x+n,y+2*n);
80                 unit(x+2*n,y);
81             }
82         }
83     }
84 
85     printf("%d\n",ans);
86 
87     return 0;
88 }

 

posted @ 2017-12-12 18:38  qrfkickit  阅读(173)  评论(0编辑  收藏  举报