poj 1182

食物链
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 94453   Accepted: 28515

Description

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 
现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 
有人用两种说法对这N个动物所构成的食物链关系进行描述: 
第一种说法是"1 X Y",表示X和Y是同类。 
第二种说法是"2 X Y",表示X吃Y。 
此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。 
1) 当前的话与前面的某些真的话冲突,就是假话; 
2) 当前的话中X或Y比N大,就是假话; 
3) 当前的话表示X吃X,就是假话。 
你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。 

Input

第一行是两个整数N和K,以一个空格分隔。 
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。 
若D=1,则表示X和Y是同类。 
若D=2,则表示X吃Y。

Output

只有一个整数,表示假话的数目。

Sample Input

100 7
1 101 1 
2 1 2
2 2 3 
2 3 3 
1 1 3 
2 3 1 
1 5 5

Sample Output

3



 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 using namespace  std;
 6 const   int N = 5e4+9;
 7 /*
 8 A: 1~N,B: N+1~2*N,C:2*N+1~3*N
 9 共有9种情况
10 d = 1 : AA,BB,CC
11 d = 2 : AB,BC,CA
12 d = 1 :不能出现捕食、被捕食的关系
13 捕食 AB,same(x,y+n) 就可以代表 AB,BC,CA了,因为是同时unite
14 被捕食 AC,same(x,y+2*n) 就可以代表BA,CB,AC了。
15 */
16 int  pre[3*N],n,k;
17 int  d,x,y;
18 void  init(int  n)
19 {
20     for(int  i = 0;i <=3*n ;i++){
21         pre[i]=i;
22     }
23 }
24 int  find(int  x)
25 {
26     return  pre[x]= pre[x]==x?x:find(pre[x]);
27 }
28 void   unite(int x,int y){
29     x = find(x);
30     y = find(y);
31     if(x!=y){
32         pre[x] = y;
33     }
34 }
35 bool same (int x,int  y){
36     return  find(x) == find(y);
37 }
38 int  ans;
39 int   main()
40 {
41     scanf("%d%d",&n,&k);
42     init(n);
43     ans   = 0;
44     for(int  i = 0;i <k;i++){
45         scanf("%d%d%d",&d,&x,&y);
46         if(x>n||y>n) ans++;        
47         else if(d==2&&x==y) ans++;
48         else{
49             
50             if(d==1){
51                 if(same(x,y+n)||same(x,y+2*n)) ans++;
52                 else unite(x,y),unite(x+n,y+n),unite(x+2*n,y+2*n);
53             }
54             else{
55                 if(same(x,y)||same(x,y+2*n)) ans++;
56                 else unite(x,y+n),unite(x+n,y+2*n),unite(x+2*n,y);
57             }
58         }
59     }
60     printf("%d\n",ans);
61 }

 

posted on 2018-11-03 20:38  cltt  阅读(152)  评论(0编辑  收藏  举报

导航