POJ 1182 食物链
2015-08-17 13:27
302 查看
题意就不讲解了,很经典的一道题目,这是链接:<span style="font-family: Arial, Helvetica, sans-serif;">http://poj.org/problem?id=1182</span>
题解:利用并查集,注意考虑合并时的关系更新
</pre><pre name="code" class="cpp">#include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include <iostream> #include <queue> #include <stack> #include <vector> #include <map> #include <set> #define INF 0x3f3f3f3f #define maxn 50010 using namespace std; int parent[50010], relation[50010]; //parent[x]是x的父节点 relation[x]是x与根节点的关系 int N, K, X, Y, D, ans = 0; void init() { for(int i = 0; i < N; i++) { parent[i] = i; relation[i] = 0; } } //初始化数组 int find(int x) { if(x != parent[x]) { int temp = parent[x]; parent[x] = find(temp); //必须先从父节点更新 relation[x] = (relation[x] + relation[temp]) % 3; //不断更新当前节点与根节点关系 } return parent[x]; } //寻找x的根节点 void Union() { int px = find(X); int py = find(Y); parent[py] = px; relation[py] = (D - 1 + 3 - relation[Y] + relation[X]); //更新Y根节点与总的根节点关系 } //合并X,Y int main() { scanf("%d%d", &N, &K); init(); while(K--) { scanf("%d%d%d", &D, &X, &Y); if(X > N || Y > N) ans++; else if(D == 2 && X == Y) ans++; else { if(find(X) == find(Y)) { if((3 - relation[X] + relation[Y]) % 3 != D - 1) //3-部分是X与根节点关系 relation[Y]是根节点与X关系 加起来就是X与Y关系 ans++; } else Union(); } } printf("%d\n",ans); return 0; }
相关文章推荐
- 选择排序
- android中的与GPS定位的API
- 九度oj 1067
- IIC知识
- 极客编程小挑战#30:用CSS3实现各种钟表的显示效果
- F.lux——自动调整屏幕亮度与颜色,降低蓝光
- AS3写的页面注册登录组件
- 【effective c++读书笔记】【第7章】模板和泛型编程(3)
- 【effective c++读书笔记】【第7章】模板和泛型编程(3)
- 如何在QML应用中调用系统设置中的页面来设置我们的系统
- 【bzoj3306】 树 dfs序+线段树
- UI星辰:UI代码创建视图和Label设置
- CGI编程完全手册
- Uncaught TypeError: Cannot read property 'prototype' of null using Openerp 7.0
- mysql中文乱码解决方案
- IOS中CALayer的使用
- mac 下修改mysql的密码
- 栈 Deque
- android 音乐模仿器demo,实现指定目录下的音乐循环播放,和在线播放的方法。
- 开发笔记:基于EntityFramework.Extended用EF实现指定字段的更新