• 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
    ",ans);
    61 }
  • 相关阅读:
    mysql_fetch_array()和mysql_fetch_assoc()两个函数的区别
    在vmware workstation7上安装centos5.5的一些问题
    如何在CentOS下安装VMwareTools工具
    ResultSetMetaData类的介绍
    火狐快捷键
    ResultSetMetaData类的介绍
    jstl标签的使用
    e.printStackTrace()介绍
    mysql初学指南
    在SQL server中,怎么区别char跟varchar?
  • 原文地址:https://www.cnblogs.com/tingtin/p/9902011.html
Copyright © 2020-2023  润新知