HDOJ1272并查集加判断森林
2015-08-05 21:48
274 查看
#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> using namespace std; #define MAX_N 100005 static int par[MAX_N]; static void init() { for(int i=0;i<MAX_N;++i) par[i] = 0; } static int getParent(int u) { if (par[u]!=u) par[u] = getParent(par[u]); return par[u]; } static void merge(int u,int v) { int p1 = getParent(u); int p2 = getParent(v); if (p1==p2)return; par[p1] = p2; } static bool same(int u,int v) { int p1 = getParent(u); int p2 = getParent(v); if (p1==p2)return true; return false; } int main() { int u,v; int cnt = 0; while(true) { scanf("%d %d",&u,&v); if (u==-1&&v==-1) break; init(); bool flag = false; cnt = 0; if (u==0&&v==0) { flag = false; printf("Yes\n"); continue; } else { par[u] = u; par[v] = v; merge(u,v); while(scanf("%d %d",&u,&v)&&u&&v) { if (par[u]==0) par[u] = u; if (par[v]==0) par[v] = v; if (same(u,v)) flag = true; merge(u,v); } } int k=0; //统计是否是森林 for (int i=1;i<MAX_N;++i) if (par[i]==i) k++; if (k>1||flag) printf("No\n"); else printf("Yes\n"); } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法
- C#实现的算24点游戏算法实例分析
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析