杭电 小希的迷宫 (并查集)
2013-10-09 20:51
597 查看
思路:
1. 判断是否能让两个顶点连在一起.
2. 生成树的个数.
注意: 的还有0 0 也是一棵树
这题解出来了,可是is it a tree?竟然超时,有待思考
1. 判断是否能让两个顶点连在一起.
2. 生成树的个数.
注意: 的还有0 0 也是一棵树
这题解出来了,可是is it a tree?竟然超时,有待思考
#include <iostream> using namespace std; #define MAX 100010 int mark[MAX], set[MAX]; int find(int n) { return set ==n?n:find(set ); } int Unioun(int u, int v) { int x, y; x = find(u); y = find(v); if (x!=y) { set[x] = y; return 1; } else return 0; } int main() { int u, v, flag, nc, i; while (1) { flag = 1; memset(mark, 0, sizeof(mark)); while (cin>>u>>v && (u!=-1&&v!=-1)) { if (u==0&&v==0) //0 0 也是树 { cout<<"Yes"<<endl; continue; } for (i=0; i<MAX; i++) set[i] = i; int max=-1, min=MAX; while (u||v) { if (u>max) max=u; if (v>max) max=v; if (u<min) min=u; if (v<min) min=v; mark[u] = mark[v] = 1; if (Unioun(u, v)==0) //判断是否能连接上 flag = 0; cin>>u>>v; } if (flag==0) cout<<"No"<<endl; else { nc = 0; for (i=min; i<=max; i++) { if (mark[i]&&set[i]==i)//记录是否只有一棵树 nc++; } if (nc==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } if (u==-1 && v==-1) break; } return 0; }
相关文章推荐
- iOS之文件处理
- JAVA反射机制
- 高级IO复用应用:聊天室程序
- C语言趣味编程--同时显示正弦曲线和余弦曲线
- python字符串使用方法总结
- Invitation Cards
- JSON Spirit 中文支持
- Leetcode:3Sum Closest
- 策略者模式(行为型)+简单实现例子
- 反向索引
- Android下载多个文件时的进度条
- POJ1002 487-3279 WA了好几回 TUT
- Qt 方向盘实现
- 关于window.location.href is not a function在FF,chrom报错问题
- 【Cocos2d-x】Win7+ vs2012,2010 + Cocos2d-x2.2 配置Cocos2d-X项目-环境
- 迷茫
- 完美安装ubuntu
- 保险条款精解(四)索赔——不可不看,因为您以前可能没听说过
- hdu 4339 Query(单点更新+二分查找)
- 保险条款精解(三) 撞车