带权并查集,或者叫做种类并查集,经典题。

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 食物链的更多相关文章

  1. 种类并查集——带权并查集——POJ1182;HDU3038

    POJ1182 HDU3038 这两个题比较像(一类题目),属于带权(种类)并查集 poj1182描绘得三种动物种类的关系,按照他一开始给你的关系,优化你的种类关系网络,最后看看再优化的过程中有几处矛 ...

  2. 并查集例题02.带权并查集(poj1182)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底 ...

  3. 带权并查集 poj1182

    首先要注意核心代码 int find(int i){    if(i == fa[i])        return fa[i];    int tt = find(fa[i]);    num[i] ...

  4. 【POJ1182】 食物链 (带权并查集)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  5. poj1182食物链,经典带权并查集

    动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种 ...

  6. poj1182 食物链(带权并查集)

    题目链接 http://poj.org/problem?id=1182 思路 前面做的带权并查集的权值记录该结点与其父结点是否是同一类,只有两种取值情况(0,1),在这题中某结点a和其父结点b的取值共 ...

  7. Poj1182 食物链(并查集/带权并查集)

    题面 Poj 题解 这里采用并查集的补集. \(x\)表示同类集合,\(x+n\)表示敌人集合,\(x+n\times2\)表示敌人的敌人集合. 如果当前给出的是一对同类关系,就判断\(x\)是否吃\ ...

  8. poj1182 食物链 带权并查集

    题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...

  9. POJ 1182 食物链 【带权并查集】

    <题目链接> 题目大意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我 ...

随机推荐

  1. hdu 1863 畅通工程 (并查集+最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

  2. C++之指针,引用与数组

    引用只是对象的另一个名字,通过在变量名前面添加"&”符号来定义,而指针保存的是另一个对象的地址,它们两都提供了间接访问所服务变量的途径. 但是它们的差别还是挺大的: 先从它们的值说起 ...

  3. Call Mode feature

    起源 user 在插著 充電器 打電話的狀況下, 為了安全起見, 避免 充電器在這時損害手機,間接造成 user 的傷害, 而有了這 feature, 在 battery voltage Vbat & ...

  4. Linux内核基础--事件通知链(notifier chain)【转】

    转自:http://blog.csdn.net/wuhzossibility/article/details/8079025 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个 ...

  5. linux 命令行远程登录 后台运行命令的方法

    linux 命令行远程登录 后台运行命令的方法 http://blog.csdn.net/isuker/article/details/55061595 Linux 技巧:让进程在后台可靠运行的几种方 ...

  6. 使用XShell通过SSH访问Google谷歌云服务器方法

    1:先用Xshell创建个密钥 下一步到这里,这个名称要记得,谷歌后台要用的. 把这里的公钥复制出来,当然最好也可以备份下. 2:到谷歌后台去添加ssh,然后就能连接了. 复制刚才生成的公钥,在谷歌云 ...

  7. scrapy再学习与第二个实例

    这周对于Scrapy进一步学习,知识比较零散,需要爬取的网站因为封禁策略账号还被封了/(ㄒoㄒ)/~~ 一.信息存储 1.log存储命令:scrapy crawl Test --logfile=tes ...

  8. mybatis多表查询,自动生成id

    主要是在配置文件中,配置好所要包含的字段. 类关系:account----role,1对1 account包含role类 java类: public class Account{ private In ...

  9. Insertion Sort List——链表的插入排序

    Sort a linked list using insertion sort. 这道题跟 Sort List 类似,要求在链表上实现一种排序算法,这道题是指定实现插入排序.插入排序是一种O(n^2) ...

  10. Java学习笔记(七)——获取类中方法的信息,java的LinkedList

    [前面的话] 在实际项目中学习知识总是最快和最有效的,既能够较好的掌握知识,又能够做出点东西,还是简单的知识总结,最近一直在总结笔记,写的东西还是比较水,希望慢慢可以写出一些干货. 学习过程中的小知识 ...