hdu 1272 小希的迷宫
2015-05-30 16:47
302 查看
这是我第一次用并查集解决问题,其实刷这道题就是为了学习并查集,这是学长在hdu上找的模板题
#include <iostream> #include <cstdio> using namespace std; const int N = 110000; int par , mark ; int find1(int x) { int r = x; while(par[r] != r) r = par[r]; int i = x, j; while(i != r) j = par[i], par[i] = r, i = j; return r; } void unite(int x, int y) { x = find1(x); y = find1(y); par[x] = y; } bool same(int x, int y) { return find1(x) == find1(y); } int main() { while(true) { int a, b, min1 = 0x7fffffff, max1 = 0x80000000, f = 1, flag = 1, sum = 0; for(int i = 0; i < N; i++) par[i] = i, mark[i] = 0; while(true) { scanf("%d%d", &a, &b); sum++; if(a == -1) { f = 0; break; } if(a == 0) break; min1 = (min1 < min(a, b)) ? min1 : min(a, b); max1 = (max1 > max(a, b)) ? max1 : max(a, b); mark[a] = mark[b] = 1; if(same(a, b) == true) flag = 0; else unite(a, b); } if(!f) break; if(sum == 1 && a == 0) {printf("Yes\n"); continue;} if(!flag) {printf("No\n"); continue;} int cnt = 0; for(int i = min1; i <= max1; i++) if(mark[i] && par[i] == i) cnt++; if(cnt == 1) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- 对select表单控件进行美化
- Linux系统编程——多任务的同步与互斥
- js取整数四舍五入
- SQL/Oracle取出第 m 条到第 n 条记录的方法
- linux学习笔记—shell脚本执行方式
- Android开发中的MVC设计模式
- JVM如何理解Java泛型类(转)
- SQL 存储过程
- 腾讯Bugly与极客学院再次联手,首推「iOS Crash 跟踪方法」视频教程!
- 设计模式——命令模式
- 软件工程项目冲刺阶段二:第六天
- DirectX实现光照、纹理
- ThreadLocal使用
- Windows、Ubuntu双系统下,给Ubuntu增加磁盘空间
- 数据库连接池的配置(mysql+sql2000+sql2008+sybaase)
- js加载顺序测试
- 电脑实用小技巧
- 禁止uiscrollview垂直方向滚动,只允许水平方向滚动;或只允许垂直方向滚动
- HTML5的localStorage、sessionStorage和SQL的CRUD的使用
- Serializable接口