【带权并查集】poj1182 食物链
带权并查集,或者叫做种类并查集,经典题。
http://blog.csdn.net/shuangde800/article/details/7974668
这份代码感觉是坠吼的。
我的代码是暴力分类讨论的,没有用取模的写法,取模的写法更简洁,证明要用到同余的知识,通用性不高,具体可以看上面那份代码。
就并查集每个结点记录与其父节点的关系,并且在路径压缩,以及集合合并的时候进行讨论。
代码风格在程设老师的教育下进行了改变,的确感觉比高中那种代码风格要好点。
#include<cstdio>
using namespace std;
int fa[50010],rel[50010];
int n,m,ans;
int findroot(int x){
if(x==fa[x]){
return x;
}
int Fa=findroot(fa[x]);
if(rel[x]==0 && rel[fa[x]]==0){
rel[x]=0;
}
else if(rel[x]==0 && rel[fa[x]]==1){
rel[x]=1;
}
else if(rel[x]==0 && rel[fa[x]]==2){
rel[x]=2;
}
else if(rel[x]==1 && rel[fa[x]]==0){
rel[x]=1;
}
else if(rel[x]==1 && rel[fa[x]]==1){
rel[x]=2;
}
else if(rel[x]==1 && rel[fa[x]]==2){
rel[x]=0;
}
else if(rel[x]==2 && rel[fa[x]]==0){
rel[x]=2;
}
else if(rel[x]==2 && rel[fa[x]]==1){
rel[x]=0;
}
else if(rel[x]==2 && rel[fa[x]]==2){
rel[x]=1;
}
return fa[x]=Fa;
}
int main(){
// freopen("poj1182.in","r",stdin);
int op,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
fa[i]=i;
}
for(int i=1;i<=m;++i){
scanf("%d%d%d",&op,&x,&y);
if(x>n || y>n || (op==2 && x==y)){
++ans;
continue;
}
int f1=findroot(x),f2=findroot(y);
if(f1==f2){
if(op==1){
if(rel[x]!=rel[y]){
++ans;
}
}
else{
if(rel[x]==0 && rel[y]!=2){
++ans;
}
else if(rel[x]==1 && rel[y]!=0){
++ans;
}
else if(rel[x]==2 && rel[y]!=1){
++ans;
}
}
}
else{
fa[f1]=f2;
if(op==1){
if(rel[x]==0 && rel[y]==0){
rel[f1]=0;
}
else if(rel[x]==0 && rel[y]==1){
rel[f1]=1;
}
else if(rel[x]==0 && rel[y]==2){
rel[f1]=2;
}
else if(rel[x]==1 && rel[y]==0){
rel[f1]=2;
}
else if(rel[x]==1 && rel[y]==1){
rel[f1]=0;
}
else if(rel[x]==1 && rel[y]==2){
rel[f1]=1;
}
else if(rel[x]==2 && rel[y]==0){
rel[f1]=1;
}
else if(rel[x]==2 && rel[y]==1){
rel[f1]=2;
}
else if(rel[x]==2 && rel[y]==2){
rel[f1]=0;
}
}
else{
if(rel[x]==0 && rel[y]==0){
rel[f1]=1;
}
else if(rel[x]==0 && rel[y]==1){
rel[f1]=2;
}
else if(rel[x]==0 && rel[y]==2){
rel[f1]=0;
}
else if(rel[x]==1 && rel[y]==0){
rel[f1]=0;
}
else if(rel[x]==1 && rel[y]==1){
rel[f1]=1;
}
else if(rel[x]==1 && rel[y]==2){
rel[f1]=2;
}
else if(rel[x]==2 && rel[y]==0){
rel[f1]=2;
}
else if(rel[x]==2 && rel[y]==1){
rel[f1]=0;
}
else if(rel[x]==2 && rel[y]==2){
rel[f1]=1;
}
}
}
}
printf("%d\n",ans);
return 0;
}
【带权并查集】poj1182 食物链的更多相关文章
- 种类并查集——带权并查集——POJ1182;HDU3038
POJ1182 HDU3038 这两个题比较像(一类题目),属于带权(种类)并查集 poj1182描绘得三种动物种类的关系,按照他一开始给你的关系,优化你的种类关系网络,最后看看再优化的过程中有几处矛 ...
- 并查集例题02.带权并查集(poj1182)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底 ...
- 带权并查集 poj1182
首先要注意核心代码 int find(int i){ if(i == fa[i]) return fa[i]; int tt = find(fa[i]); num[i] ...
- 【POJ1182】 食物链 (带权并查集)
Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
- poj1182食物链,经典带权并查集
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种 ...
- poj1182 食物链(带权并查集)
题目链接 http://poj.org/problem?id=1182 思路 前面做的带权并查集的权值记录该结点与其父结点是否是同一类,只有两种取值情况(0,1),在这题中某结点a和其父结点b的取值共 ...
- Poj1182 食物链(并查集/带权并查集)
题面 Poj 题解 这里采用并查集的补集. \(x\)表示同类集合,\(x+n\)表示敌人集合,\(x+n\times2\)表示敌人的敌人集合. 如果当前给出的是一对同类关系,就判断\(x\)是否吃\ ...
- poj1182 食物链 带权并查集
题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...
- POJ 1182 食物链 【带权并查集】
<题目链接> 题目大意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我 ...
随机推荐
- 有趣的浏览器地址栏js代码
1.编辑网页 在地址栏输入下面的代码按enter,网页上所有元素都能变成可编辑状态,你可以移动.调整元素大小.如果你只是讨厌某个网站想发泄一下,我建议你使用NetDisater. 代码如下: 程序代码 ...
- 【R语言学习】时间序列
时序分析会用到的函数 函数 程序包 用途 ts() stats 生成时序对象 plot() graphics 画出时间序列的折线图 start() stats 返回时间序列的开始时间 end() st ...
- device tree --- label
[label:] <device node name>[@ unit-address] 為 device node 取 label name, 可以在其它位置使用 &label 存 ...
- SVN--版本控制系统
引言 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subvers ...
- Mysql 数据库学习笔记04 函数
一.创建自定义函数 * 使用自定义函数,可以返回字符串.整型.实数或者其他类型: create [aggregate] function 名称 (参数列表) return type begin //函 ...
- php设计模式五----适配器模式
1.简介 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 意图:将一个类的接口转换成客户希望的另外一个接口 ...
- Mac下 Docker部署SpringBoot应用
一.安装Docker环境 使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker. Homebrew 的 Cask 已经支持 Docker for Mac,因此 ...
- ES6 一种新的数据结构--Map跟Objct的区别
var map1=new Map(); var keys={key:'val'}; map1.set(keys,'content'); ==> {Object {key: "val&q ...
- Distinct Subsequences ——动态规划
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- Python基础系列----序列(列表、元组、字符串)
1.定义 1 ...