zoukankan      html  css  js  c++  java
  • 并查集之食物链

                                                 食物链
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 29339   Accepted: 8561

    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

    Source

     
    在博客上第一次贴poj的题目  嘿嘿  最近在学并查集  好好加油
     
     1 #include <iostream>
     2 #include <string>
     3 #include <cstdio>
     4 using namespace std;
     5 #define  Max 50050
     6 int p[Max];
     7 int d[Max];
     8 int N,K,a,b,c;
     9 
    10 void init()
    11 {
    12     for (int i=1;i<=N;i++)
    13     {
    14         p[i]=i;
    15         d[i]=0;
    16     }
    17 }
    18 
    19 int find(int x) 
    20 { 
    21     if(p[x]==x)return x; 
    22     int px=find(p[x]); 
    23     d[x]=(d[x]+d[p[x]])%3; 
    24     return p[x]=px; 
    25 } 
    26 
    27 bool unionset(int x,int y,int D) 
    28 { 
    29     int px=find(x);int py=find(y); 
    30     if(px==py)return((d[x]-d[y]+D-1)%3!=0); 
    31     p[py]=px; 
    32     d[py]=(d[x]-d[y]+D+2)%3; 
    33     return false; 
    34 } 
    35 
    36 int main()
    37 {
    38 scanf("%d %d",&N,&K);
    39     init();
    40     int sum=0;
    41     while (K--)
    42     {
    43             scanf("%d%d%d",&a,&b,&c);
    44             if (b>N||c>N||(b==c&&a==2))
    45             {
    46                 sum++;
    47                 continue;
    48             }
    49           else sum+=unionset(b,c,a);
    50         
    51     }
    52     cout<<sum<<endl;
    53     return 0;
    54 }
  • 相关阅读:
    visual studio 2019 sql server localdb 数据库中文乱码解决方法
    Ado.net总结
    Ado.Net总结
    提升DataGridView加载速度的三个属性设置
    winform程序:newtonsoft json 序列化时出现 “unterminated string. Excepted delimiter..."
    entityframewor core 不让属性生成数据库的列
    在winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序
    使用cefsharp在winform中嵌套浏览器
    PIE SDK算法的同步调用
    PIE SDK小波变换
  • 原文地址:https://www.cnblogs.com/wujianwei/p/2585177.html
Copyright © 2011-2022 走看看