poj 1182 食物链

31 篇文章 0 订阅

http://poj.org/problem?id=1182

分析:

rank[x]=(rank[x]+rank[t])%3;

rank[t1]=(rank[y]-rank[x]+d-1+3)%3;

参考:http://cavenkaka.iteye.com/blog/1489588

#include<iostream>
#include<cstdio>
using namespace std;
const int NUM=50005;
int father[NUM],rank[NUM];
int Find(int x)
{
	if(x!=father[x]) 
	{
	int t=father[x];
	father[x]=Find(father[x]);
	rank[x]=(rank[x]+rank[t])%3;//某结点和爷爷的关系由它和父亲的关系决定,每一层相差1(0:同类,1:吃父亲,2:被吃)
	}
	return father[x];
}

void Union(int x,int y,int d)
{
	int t1=Find(x),t2=Find(y);
	father[t1]=t2;
	rank[t1]=(rank[y]-rank[x]+d-1+3)%3;
}

int main()
{
	int i,x,y,d,count,N,K;
	scanf("%d%d",&N,&K);
	for(i=0;i<=N;i++)
	{father[i]=i;rank[i]=0;}
	count=0;
	while(K--)
	{
		scanf("%d%d%d",&d,&x,&y);
		if(x>N||y>N||(d==2&&x==y)) {count++;continue;}	
		
		int t1=Find(x),t2=Find(y);
		if(t1==t2)
		{
			if((rank[x]-rank[y]+3)%3!=d-1) count++;//0->2,1->0,2->1	
		}
		else
			Union(x,y,d);
	}
	printf("%d\n",count);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值