1182 食物链

原创 2007年10月15日 08:32:00
食物链
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 5041   Accepted: 1128

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

 

Sample Output

 

Source
Noi 01

 ******************************************************************************************

*************************************************************************************

Source Code
#include <stdio.h>
#define maxn 50004

int  parent[maxn];
int    relation[maxn];   
 int result[][3]={1 , -1 , 0, 0 , 1 , -1 , -1 , 0 , 1};
 int result2[][3]={0 , 1 , -1 , -1 , 0 , 1 , 1 , -1 , 0};
 int next[][3]={1 , -1 , 0 , -1 , 0 , 1 , 0 , 1 , -1};
 int behind[][3]={0 , -1 , 1 , 1 , 0 , -1 , -1 , 1 , 0};

 void find(int x,int &y,int &d)
 {
    int z,r,now;
	d=0;z=x;
	 while (parent[x] > 0)
	 { d = next[d+1][relation[x]+1];
        x = parent[x];
     }
	 y = x; now = d;

	  while (z !=y )
	 { 
		  x = parent[z];
        parent[z] = y;
        r = relation[z];
        relation[z] = now;
        now = behind[now+1][r+1];
        z = x;
     } 
 }

 void merge(int a,int b,int r)
 {
   if(parent[a]>parent[b])
     {
	    parent[b] = parent[a] + parent[b];
        parent[a] = b;
        relation[a] = r;
     }
   else {
          parent[a] = parent[a] + parent[b];
        parent[b] = a;
        relation[b] = -r;
        }
 
 }

int main()
{
	 int n , k , lie , i ;    
     int x , y , a , b   ;  
     int u , v , d , nr  ;
	scanf("%d%d",&n,&k);

	for(i=1;i<=n;i++)
	{
	   parent[i] = -1;
      relation[i] = 0;
	}

	lie=0;
	for(i=1;i<=k;i++)
	{
	  scanf("%d%d%d",&d,&x,&y);
	  if(x>n||y>n)
		{
	      lie+=1;
		  continue;
	    }
       find(x , a , u);
       find(y , b , v);
	   if(d==2)  nr = result[u+1][v+1];
	   else  nr = result2[u+1][v+1];
          if(a==b)
		{
		  if(nr!=0) 
			  lie+=1;
		}

		else   merge(a , b , nr);
 
	}

	  printf("%d/n",lie);	
	return 0;
}

 

3

 

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

POJ 1182 食物链【经典并查集应用】

食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33805   Accepted:...
  • Cfreezhan
  • Cfreezhan
  • 2013年04月07日 14:18
  • 5200

POJ1182 - 食物链(带权并查集)

题目链接:http://poj.org/problem?id=1182题目大意:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-...
  • ACM_Fish
  • ACM_Fish
  • 2017年05月13日 10:25
  • 591

POJ 1182食物链

题目来源:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000...
  • u012560612
  • u012560612
  • 2014年09月05日 11:06
  • 771

poj 1182 食物链

带权并查集的题--》
  • u013467535
  • u013467535
  • 2014年10月28日 10:57
  • 488

poj 1182 食物链(DSU)

①普通并查集: f[i]=i,表示i属于A f[i]=i+n,表示i属于B f[i]=i+2*n,表示i属于C 每次合并之前先进行判断 如果x和y属于同类,则需要判断(x,y+n)和...
  • rachelsg
  • rachelsg
  • 2016年03月07日 08:58
  • 146

POJ 1182 食物链

题目大意:中文
  • u013569656
  • u013569656
  • 2014年07月16日 11:11
  • 340

poj 1182 食物链

题目是中文的题目意思
  • u010471546
  • u010471546
  • 2014年11月13日 20:29
  • 142

POJ 1182 食物链

POJ 1182 食物链 并查集经典题目
  • u010084308
  • u010084308
  • 2014年08月02日 22:25
  • 820

POJ 1182 食物链

这题一开始用并查集写,捣鼓了半天不对,于是上网一看用带权并查集,于是乎,就去看带权并查集,然后过来写这题。 用deep[i]表示i到祖先的偏移量,如果x和y是一类的,那么偏移量=0,如果x吃y,那么...
  • u013621213
  • u013621213
  • 2015年01月04日 19:05
  • 200

POJ 1182 食物链

Description动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。  现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到...
  • Ezereal
  • Ezereal
  • 2015年08月17日 13:27
  • 306
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1182 食物链
举报原因:
原因补充:

(最多只允许输入30个字)