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;
}


相关文章
|
算法
食物链问题(并查集)
食物链问题(并查集)
98 0
|
算法
算法 - 蓝桥杯并查集题型
算法 - 蓝桥杯并查集题型
110 0
J - 食物链 POJ - 1182
J - 食物链 POJ - 1182
110 0
|
算法
【蓝桥杯算法 1】AcWing166.飞行员兄弟
【蓝桥杯算法 1】AcWing166.飞行员兄弟
131 0
【蓝桥杯算法 1】AcWing166.飞行员兄弟
|
Web App开发 算法
蓝桥杯 floyd算法练习 最短路
蓝桥杯 floyd算法练习 最短路
134 0
蓝桥杯 floyd算法练习 最短路
|
定位技术
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
宝岛探险(求岛屿大小,染色法) 宽搜 深搜
|
C++
这道「岛屿题」用并查集做就体现出其威力了!
之前的岛屿题,用 DFS 和 BFS 来做要比用并查集更加好做并且高效,但是最对这一道题来说,用并查集要更加好做。
111 0
牛客-加边的无向图(思维+并查集)
牛客-加边的无向图(思维+并查集)
74 0