【带权并查集】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中的一种,但是我 ...
随机推荐
- ASP.NET MVC各个版本区别
ASP.NET MVC 1 view接收用户输入,把命令传到controller controller处理命令,更新model model被更新后,会通知view需要update view更新后向用户 ...
- poj 1298 The Hardest Problem Ever
题目链接:http://poj.org/problem?id=1298 题目大意:按照所给的顺序要求将输入的字符串进行排列. #include <iostream> #include &l ...
- perl 列出一个目录下的文件的大小
use strict; use warnings; use Cwd; my $dir = 'd:\\www'; chdir($dir); opendir DIR, $dir or die " ...
- C++之参数总结
函数的形参为函数提供了已命名的局部存储空间,它是在函数的形参表中定义的,并由调用函数时传递给函数的实参初始化,而形参的 初始化与变量的初始化一样,如果形参具有非引用类型,则复制实参的值,如果形参为引用 ...
- Linux-进程间通信(五): 网络套接字
不想说话,坑太深:持续学习网络编程中...
- Bit banging
Bit banging Bit banging is a technique for serial communications using software instead of dedicated ...
- U-Boot启动过程完全分析<转>
转载自:http://www.cnblogs.com/heaad/archive/2010/07/17/1779829.html 1.1 U-Boot工作过程 U-Boot启动内核的过程可 ...
- Mongo 配置文件 [www]
Mongo 配置文件 [www] http://blog.chinaunix.net/uid-25206403-id-3510934.html mongodb 安装使用 http://blog.si ...
- 一个朋友 js图表开发问题 用 c和 js 解决
引言 不求知道一切, 只求发现一件 -- 乔治·西蒙·欧姆 附注:那些存在于梦幻中的事迹,那些儿时梦中的人物,每每看起,都觉得 .哎 .... 岁月 ... 一直在努力 ... ...
- 微信小程序时钟(xx年xx月xx日xx:xx格式)
wxml: <view>时间:{{newTime}}</view> js: page({ data:{ newTime:'' }, onLoad: function (opti ...