【poj 1182】 食物链 题解&代码(C++)
2016-04-05 20:30
197 查看
题目链接:
http://poj.org/problem?id=1182
题解:
经典的并查集关系类问题,还是类似 poj1703 的方法,用x+n表示 x所吃的集合,用x+2×n表示 吃x的集合 ,然后用并查集连连连就行。。。
代码:
http://poj.org/problem?id=1182
题解:
经典的并查集关系类问题,还是类似 poj1703 的方法,用x+n表示 x所吃的集合,用x+2×n表示 吃x的集合 ,然后用并查集连连连就行。。。
代码:
#include<iostream> #include<algorithm> #include<stdio.h> #define maxn (50005) using namespace std; int n,m,fa[4*maxn],ans; void init() { for (int i=1;i<=4*n;i++) fa[i]=i; } int find(int x) { if (fa[x]==x) return fa[x]; return fa[x]=find(fa[x]); } void unio(int x,int y) { fa[find(x)]=find(y); return ; } int pan1(int x,int y)//判断 x与y是同类 是否是真话 { if (x>n || y>n || x<=0 ||y<=0) return 0; if (find(x+n)==find(y) || find(x+2*n)==find(y)) return 0; //如果 x所吃的东西与y是同类 或 吃x的东西与y是同类,返回0(假话) return 1; } int pan2(int x,int y)//判断 x吃y 是否是真话 { if (x>n || y>n || x<=0 ||y<=0 || x==y) return 0; if (find(x)==find(y) || find(x+2*n)==find(y)) return 0; //x与y是同类,或,y与吃x的东西是同类,则返回0(是假话) return 1; } int main() { scanf("%d%d",&n,&m); init();ans=0; for (int i=1;i<=m;i++) { int p,x,y; scanf("%d%d%d",&p,&x,&y); if (p==1) { if (pan1(x,y)) { //要注意同时将三个集合全部重合 unio(x,y); unio(x+n,y+n); unio(x+2*n,y+2*n); } else ans++; } else { if (pan2(x,y)) { unio(x+n,y);//y与x吃的东西连接 unio(x+2*n,y+n);//y吃的东西与吃x的东西连接 unio(x,y+2*n);//x与吃y的东西连接 } else ans++; } } printf("%d\n",ans); }
相关文章推荐
- Obj2002java
- java二分搜索算法
- Spring自动装配Bean属性的四种方式
- Objhdu2001java
- sublime text 2 运行pyqt没有显示
- Python 对新浪微博的博文元素 (Word, Screen Name)的频率分析
- C++ 语法实验室之强大的lambda表达式
- STL学习笔记— —容器array
- spring aop面向切面编程
- this和Super关键字
- C语言中的static作用
- Python列表和元组
- 程序运行时的内存空间分布(二)堆和栈的比较
- unix环境多进程编程----用到的32个系统调用详解
- Dom编程的入门
- PHP解决Xss跨域攻击以及sql注入等危险字符串方案类库
- OpenGL基础图形编程(二)OpenGL概念建立
- ZOJ 3872-Beauty of Array(递推||DP)
- Java GC机制
- 学习javaEE每一天2016.4.5