POJ 1182 食物链(种类并查集)
记得第一次做这道题的时候,推关系感觉有点复杂,而且写完代码后一直WA,始终找不出错误。 在A了十几道并查集后,再做这道题,发现太小儿科了。发现原来之所以WA,就在于查找根节点时,没有同步更新子节点相对根节点的关系。现在对并查集的感觉就在于,并查集的精髓就在于如何更新子节点与父节点的相对关系。
0:与根节点同类;1:被根节点吃;2:吃根节点
如何更新:
设x的根节点为fx,y的根节点为fy。
1.若fx!=fy:
合并fx、fy(将fy的父亲设为fx),那么要更新fy相对fx的关系。
fy相对y的关系为:3-rel[y],y相对x的关系为d-1(d即为数据中的d),x相对fx的关系为rel[x]。
那么fy相对fx的关系即为:(3-rel[y]+d-1+rel[x])%3。
2.若fx==fy:
那么则要判断由此推算出的y相对x的关系,是否等于数据给出的d-1。若不相等,则是假话。
y相对fy/fx的关系为rel[y],fy/fx相对x的关系为3-rel[x],
则y相对x的关系为:(rel[y]+3-rel[x])%3。
至于其他判断它为假话的条件就很好办了。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm> using namespace std;
const int maxn=;
int father[maxn];
int rel[maxn];//rel[i]表示i相对根节点的关系,0:与根节点同类;1:被根节点吃;2:吃根节点
int n,k;
void init(){
for(int i=;i<maxn;i++){
father[i]=i;
rel[i]=;
}
} int find_root(int x){
if(father[x]==x)
return x;
int tmp=father[x];
father[x]=find_root(father[x]);
rel[x]=(rel[x]+rel[tmp])%;
return father[x];
}
void Union(int x,int y,int fx,int fy,int d){
father[fy]=fx;
rel[fy]=(-rel[y]+d+rel[x])%;
}
int main()
{
int ans=,d,x,y; //ans统计假话的个数
scanf("%d%d",&n,&k);
init();//又忘记初始化了啊啊啊
for(int i=;i<=k;i++){
scanf("%d%d%d",&d,&x,&y);
//若有大于n,则为假话
if(x>n||y>n){
ans++;
continue;
} if(d==){
d=;
}
else{
d=;
//若x吃x,则是假的
if(x==y){
ans++;
continue;
}
}
int fx=find_root(x);
int fy=find_root(y);
if(fx==fy){
int t=(rel[y]+-rel[x])%;
if(t!=d){
ans++;
}
}
else{
Union(x,y,fx,fy,d);
}
}
printf("%d\n",ans);
return ;
}
POJ 1182 食物链(种类并查集)的更多相关文章
- poj 1182 食物链 (并查集)
http://poj.org/problem?id=1182 关于并查集 很好的一道题,开始也看了一直没懂.这次是因为<挑战程序设计竞赛>书上有讲解看了几遍终于懂了.是一种很好的思路,跟网 ...
- POJ 1182 食物链(并查集拆点)
[题目链接] http://poj.org/problem?id=1182 [题目大意] 草原上有三种物种,分别为A,B,C A吃B,B吃C,C吃A. 1 x y表示x和y是同类,2 x y表示x吃y ...
- POJ 1182 食物链(并查集+偏移向量)题解
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 82346 Accepted: 24616 Description ...
- POJ 1182 食物链 (并查集解法)(详细注释)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78510 Accepted: 23396 Description ...
- 【POJ 1182 食物链】并查集
此题按照<挑战程序设计竞赛(第2版)>P89的解法,不容易想到,但想清楚了代码还是比较直观的. 并查集模板(包含了记录高度的rank数组和查询时状态压缩) *; int par[MAX_N ...
- 食物链 POJ 1182(种类并查集)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- POJ 1182 食物链 【并查集】
解题思路:首先是没有思路的----然后看了几篇解题报告 http://blog.csdn.net/ditian1027/article/details/20804911 http://poj.org/ ...
- POJ 1182 食物链 经典并查集+关系向量简单介绍
题目: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有 ...
- poj 1182食物链(并查集)
算法思路:把那些确定了相对关系的节点放在同一棵树里(可以同时存在多棵树,单独每棵树中节点的相对关系确定),每个节点对应的 v[] 值记录他与根节点的关系( 0:同类: 1:根吃他: 2:他吃根 ).当 ...
随机推荐
- Java线程面试题 Top 50(转载)
原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入Java小组.转载请参见文章末尾的 ...
- C++ Double Ended Queues(双向队列)
双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样). Constructors 创建一个新双向队列 Operators 比较和赋值双向队列 assign() 设置双向队列的值 ...
- Qt获得网页源码
1.工程中添加网络模块 打开你的.pro文件插入以下代码 QT += network 2.添加代码 CodeQString NetWork::getWebSource(QUrl url) { QNet ...
- AnyCAD脚本模型
采用AnyCAD建立的模型, 基于AnyCAD.Net SDK在C#中展示模型:
- C语言 数组输出,冒泡排序法,沉底排序法,二维数组输出,输出字母列长度,从随机数组中找重复数
#include <stdio.h> #define sum 3+4//宏定义是原封不动的使用used for test4 #include <time.h>//used fo ...
- Silverlight形状、画笔、变换、图像处理、几何图形
1.形状(Ellipse.Line.Path.Polygon.Polyline 和 Rectangle) <UserControl x:Class="SharpStudy.MainPa ...
- MDX : Non Empty v/s NonEmpty
MDX : Non Empty v/s NonEmpty User Rating: / 50 PoorBest Written by Jason Thomas Friday, 07 May 20 ...
- SequoiaDB数据库集群部署
一般在多机环境下部署数据库的集群模式是比较繁琐的,下面我来分享一个如何通过shell脚本的方式简单.方便地部署我们的集群. 首先,我们要给机器配置信任关系,这样我们就无需手动的输入密码来执行ssh和s ...
- Javascript(JS)中的大括号{}和中括号[]详解
一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如:var LangShen = {"Name":"Langshen",&qu ...
- java 环境变量设置
JAVA_HOME C:\Program Files\Java\jdk1.7.0 PATH %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; CLASSPATH .;%JAV ...