POJ-1182,食物链(并查集,有点难)

简介: POJ-1182,食物链(并查集,有点难)

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


程序代码:


#include<iostream>
using namespace std;
#define N 200001
int f[N],n,k,ans=0;
int getf(int v)
{
  if(f[v]==v)
    return v;
  else
  {
    f[v]=getf(f[v]);
    return f[v];
  }
}
void merge(int v,int u)
{
  int t1=getf(v);
  int t2=getf(u);
  if(t1!=t2)
    f[t2]=t1;
  return ;
}
int main()
{
  int i,t,x,y;
  scanf("%d %d",&n,&k);
  for(i=1;i<=n*3;i++)
    f[i]=i;
  for(i=0;i<k;i++)
  {
    scanf("%d %d %d",&t,&x,&y);
    if(x<0||y<0||n<x||n<y)
    {
      ans++;
      continue;
    }
    if(t==1)
    {
      if(getf(x)==getf(y+n)||getf(x)==getf(y+2*n))
      {
        ans++;
        continue;
      }
      else
      {
        merge(x,y);
        merge(x+n,y+n);
        merge(x+2*n,y+2*n);
      }
    }
    else
    {
      if(getf(x)==getf(y)||getf(x)==getf(y+2*n))
      {
        ans++;
        continue;
      }
      else
      {
        merge(x,y+n);
        merge(x+n,y+2*n);
        merge(x+2*n,y);
      }
    }
  }
  cout<<ans<<endl;
  return 0;
}


相关文章
|
5月前
【洛谷 P2089】烤鸡(深度优先搜索)
## 摘要: 猪猪Hanke的烤鸡问题要求找出所有配料组合,使得$10$种配料(每种$1$到$3$克)的总和等于给定美味程度$n$。输入为正整数$n$,输出为方案总数及所有符合条件的配料分配,按字典序排列。样例输入$11$,输出$10$种方案。代码采用递归搜索,先计数再打印方案。$n\leq5000$时保证数据覆盖。
30 0
数据结构实验之图论四:迷宫探索
数据结构实验之图论四:迷宫探索
poj 1185 炮兵阵地 (状态压缩dp)
如果你是刚刚开始做状态压缩dp,我建议你先看看 poj 3254 Corn Fields 这是一道比这一题更简单,更容易入门的题目。 还有在代码中我用了一个很巧妙的方法求一个数二进制数中1的个数 具体请看我博客中 x& (x - 1)==0 这篇文章 链接 。
41 1
|
索引
八皇后问题
八皇后问题
236 0
|
算法
食物链问题(并查集)
食物链问题(并查集)
90 0
J - 食物链 POJ - 1182
J - 食物链 POJ - 1182
102 0
对于八皇后问题的详细说明
八皇后为解决问题说明,题目在主页
63 0
对于八皇后问题的详细说明