食物链,洛谷之提高历练地,并查集

原创 2018年04月15日 15:57:03

正文

      第二题:食物链

      这题经典啊!!!我们可以想象,如果我们可以搞一个并查集来维护x的同伙,天敌和食物就好了。

      我们想到了开三倍空间来维护x的天敌,同伙和食物。

      我们假设有一句话是x和y是同类,那么要满足两个条件,x不吃y,而且y不吃x。如果都满足,那么我们就可以把他们联系起来。

      我们再假设一句话是x吃y,那么要满足的条件显然有,x和y不为同类,而且y不吃x。

      我们再把他们联系起来即可。

      怎么联系呢?,我们看代码吧~

#include<cstdio>
#include<cstdlib>
#include<cstring>

int n,m;
int f[150010];//1<=i<=50000 1到50000表示i的同类,i+n表示i的食物,i+2*n为i的天敌。
int ans=0;

int findpa(int x){
	if(f[x]!=x) return f[x]=findpa(f[x]);
	return f[x];
}

bool comp(int x,int y){
	return findpa(x)==findpa(y);
}

void couple(int x,int y){
	if(findpa(x) != findpa(y)) f[findpa(x)]=findpa(y);
}

int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=3*n;i++)
		f[i]=i;
	for(int i=1;i<=m;i++){
		int k,x,y;
		scanf("%d %d %d",&k,&x,&y);
		if(k==2 && x==y || x>n || y>n){
			ans++;
			continue;	
		}
		if(k==1){
			if(comp(x,y+n) || comp(x+n,y)){//x不吃y,而且y不吃x。
				ans++;
				continue;
			}
			couple(x,y);
			couple(x+n,y+n);
			couple(x+2*n,y+2*n);
		}
		else{
			if(comp(x,y+n) || comp(x,y)){//x和y不为同类,而且y不吃x
				ans++;
				continue;			
			}
			couple(x,y+2*n);
			couple(x+n,y);
			couple(x+2*n,y+n);
		}
	}
	printf("%d\n",ans);
}

版权声明: https://blog.csdn.net/Deep_Kevin/article/details/79949892

C语言及程序设计提高

-
  • 1970年01月01日 08:00

SuperGCD,洛谷之提高历练地,数论(3-5)

前话      数论就是研究整数的理论。包括公约公倍数、质数、欧拉定理和同余方程等。正文       其实数论不止那么简单正文      第一题:SuperGCD      这一题就是很烦的代码加很烦...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-07 17:19:43
  • 13

[SDOI2009]E&D,洛谷之提高历练地,博弈论(3-6)

正题      第四题:[SDOI2009]E&amp;amp;D      这题不是如此的简单,因为它要涉及到找规律和Sg函数。      首先的,我们可以打一个表来观察之间的关系。      Sg...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-08 13:48:45
  • 13

[JSOI2008]星球大战,洛谷之提高历练地,并查集

正题      第三题:[JSOI2008]星球大战      这道题的大意是,给出一些边,然后每次删去某些点,求删去点后的联通块。      我们当然想到的是:并查集的操作以加点为主(没见过删点)。...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-15 16:07:43
  • 5

[NOI2002]银河英雄传说,洛谷之提高历练地,并查集

正题      第四题:[NOI2002]银河英雄传说      这道题看上去很简单,做起来却对ij之间飞船的数量给搞混了。那么我们很容易就可以知道,要求ij之间的飞船个数,只要我们知道j前面有多少飞...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-15 16:38:12
  • 22

修复公路,洛谷之提高历练地,并查集

正文      第一题:修复公路      这道题很明显啊,把边排一次序,用并查集来维护所在即可,(最小瓶颈生成树?=最小生成树)。。      所以记录一下最大值即可#include&amp;lt;...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-15 15:46:24
  • 6

POJ 1182 食物链(并查集) 详解

POJ 1182 食物链 (并查集) 详解参考做法比较经典的并查集的题目,主要是要理解路径压缩的过程。 用0 1 2 分别表示A B C的关系。 0吃1,1吃2,2吃0. 动物王国中有三类...
  • ctsas
  • ctsas
  • 2017-01-21 21:35:14
  • 14557

poj 1182 食物链(经典!种类并查集)

链接: http://poj.org/problem?id=1182 原题: Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形...
  • shuangde800
  • shuangde800
  • 2012-09-24 00:10:11
  • 7504

POJ 1182 食物链(经典并查集)

Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。  现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道...
  • gemire
  • gemire
  • 2014-03-05 20:27:26
  • 4782

种树,洛谷之提高历练地,堆

正题      第五题:种树      这题看上去很烦,实际上也很烦。。。      那么我们第一个想到的就是用堆维护最大值。      我们把多步拆成多个一步来求解,当k=1的时候,那么答案就是最大...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-16 11:42:57
  • 4
收藏助手
不良信息举报
您举报文章:食物链,洛谷之提高历练地,并查集
举报原因:
原因补充:

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