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

原创 2012年03月22日 00:11:16

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

如题。忘了参照哪个大神的blog了...莫怪-,-

设两个数组:rela[x]:表示x与其父节点的关系,pre[x],表示x的父节点。

至于神马向量公式的,通过rela[x]与rela[y]的关系与D做比较判断是否说谎

cqlf1182Accepted1080K266MSG++966B2012-03-21 23:57:17
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 50005
int N;
int pre[MAXN],rela[MAXN];//pre:parent of i,rela:relation between i and i's parent
void UFset()
{
	int i;
	for(i=1;i<=N;i++)
	{
		pre[i]=i;
		rela[i]=0;
	}
}
int find(int x)
{
	int s;
	if(x==pre[x]) return x;
	s=find(pre[x]);
	rela[x]=(rela[x]+rela[pre[x]])%3;
	return pre[x]=s;
}
int Union(int R1,int R2,int D)
{
	int r1=find(R1);
	int r2=find(R2);
	if(r1==r2)// same type
	{
		if((rela[R2]-rela[R1]+3)%3!=D)//judge the result equal type or not
			return 1;
		else 
			return 0;
	}
	else 
	{
		pre[r2]=r1;
		rela[r2]=(rela[R1]-rela[R2]+D+3)%3;
		return 0;
	}
}
int main()
{
	int K;
	int D,X,Y;
	int i;
	int num=0;
	scanf("%d%d",&N,&K);
	UFset();
	for(i=1;i<=K;i++)
	{
		scanf("%d%d%d",&D,&X,&Y);
		if(X>N||Y>N||(X==Y&&D==2)) {num++;continue;}
		if(Union(X,Y,D-1)) num++;
	}
	printf("%d\n",num);
	return 0;
}


今天是2012年8月30号。把这道并查集重新拿出来专题训练,当初做这题时是参考别人做的.不懂什么种类并查集.

所谓种类并查集:除了pre数组记录每个结点与根结点的关系,子树与新父亲结点的关系在路劲压缩时更改。

此题可根据几组数据推出一个规律:

rela[x]=(rela[x]+rela[pre[x]])%3;

这是路径压缩时,子树与新父亲结点的更新。

在合并两个结点时,判断两个根节点是否相同.

相同的话说明之前有关系就判断下关系是否等于现在的关系.

(rela[R1]-rela[R2]+3)%3!=D

不相同就加进集合,修改rela[x]属性

pre[r1]=r2;

rela[r1]=(rela[R2]-rela[R1]+D+3)%3;


/*
Problem ID:G - 食物链
meaning:
Analyzing:种类并查集,
*/
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>

using namespace std;
typedef struct even{int pi,di;}even;

#define FOR(i,s,t) for(int i=(s); i<(t); i++)
#define LL long long

#define maxn 50005
int pre[maxn],rela[maxn];
int N,K,D;
int num;
void init(){
    for(int i=0;i<maxn;i++){
        pre[i]=-1;
        rela[i]=0;
    }
}
int find(int x){
    int s=x;
    if(pre[x]<0) return x;
    s=find(pre[x]);
    rela[x]=(rela[x]+rela[pre[x]])%3;
    return pre[x]=s;
}
void Union(int R1,int R2){
    int r1=find(R1);
    int r2=find(R2);
    if(r1==r2) {
        if((rela[R1]-rela[R2]+3)%3!=D) num++;
	}
    else {
        pre[r1]=r2;
        rela[r1]=(rela[R2]-rela[R1]+D+3)%3;
    }
}
int main(){
    int X,Y;
    scanf("%d%d",&N,&K);
    num=0;
	init();
    while(K--){
        scanf("%d%d%d",&D,&X,&Y);
        if(X>N||Y>N||(X==Y&&D==2)) {num++;continue;}
        if(D==1&&X==Y) continue;
		D--;
        Union(X,Y);
    }
    printf("%d\n",num);
    return 0;
}










【POJ1182】食物链,思路+数据+代码,可能是史上关于这道题最详细的解题报告

#include #include #include #include //#define INPUT /** Problem:1182 - 食物链,NOI2001 Begin...
  • c0de4fun
  • c0de4fun
  • 2012年03月04日 19:54
  • 19015

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
  • 578

poj 1182 食物链(并查集)

食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 48054   Accepted: 14008 D...
  • jxust_tj
  • jxust_tj
  • 2015年02月09日 13:00
  • 2228

食物链 POJ1182 -- 并查集

食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26553   Accepted:...
  • tiantangrenjian
  • tiantangrenjian
  • 2011年12月19日 21:06
  • 9118

POJ1182食物链,HDU1829(种类并查集)

食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 55882   Accepted:...
  • chaiwenjun000
  • chaiwenjun000
  • 2015年12月07日 11:14
  • 465

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
  • 4237

《挑战程序设计竞赛》2.4.2 数据结构-并查集 POJ1182 2236 1703 AOJ2170

POJ1182http://poj.org/problem?id=1182题目难得的中文题。。。 食物链 Time Limit: 1000MS Memory Limit: 10000K ...
  • thudaliangrx
  • thudaliangrx
  • 2015年12月30日 23:56
  • 959

POJ 1182 食物链 并查集+偏移向量

引言: 一般的并查集都是把同一类的点放在一棵树上。但是这道题给出的是一些点的相对关系,就不能按照这样的规则建树了。应该把能够确定相对关系的点放到一棵树上。每个节点除了自身的值之外,还应该有一个域,或...
  • ECNU_LZJ
  • ECNU_LZJ
  • 2016年10月29日 00:17
  • 201

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

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

POJ-1182 食物链

题目链接:http://poj.org/problem?id=1182 解题思路: 这道题是并查集题目中的经典。。。而且比普通并查集提高了一个档次,下面在基础并查集的前提上讲解并查集的真正用法。 ...
  • niushuai666
  • niushuai666
  • 2011年11月17日 14:23
  • 9184
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1182 食物链(种类并查集)
举报原因:
原因补充:

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