UVa 10596 - Morning Walk
2015-10-09 20:26
302 查看
題目:Kamal早上散步,發現有很多條路,問能否每條路走一次回到原點。
分析:圖論,歐拉迴路,并查集。判斷是否存在歐拉迴路。
歐拉迴路存在條件:1.有邊的點度數為偶數,2.右邊的點構成的圖聯通。
說明:╮(╯▽╰)╭。
分析:圖論,歐拉迴路,并查集。判斷是否存在歐拉迴路。
歐拉迴路存在條件:1.有邊的點度數為偶數,2.右邊的點構成的圖聯通。
說明:╮(╯▽╰)╭。
#include <cstdlib> #include <cstring> #include <cstdio> #define NODE_SIZE 202 #define EDGE_SIZE 10001 int degree[NODE_SIZE]; typedef struct _edge { int point1; int point2; }edge; edge E[EDGE_SIZE]; //union_set int sets[NODE_SIZE]; int rank[NODE_SIZE]; void set_inital(int a, int b) { for (int i = a; i <= b; ++ i) { rank[i] = 0; sets[i] = i; } } int set_find(int a) { if (a != sets[a]) sets[a] = set_find(sets[a]); return sets[a]; } void set_union(int a, int b) { if (rank[a] < rank[b]) sets[a] = b; else { if (rank[a] == rank[b]) rank[a] ++; sets[b] = a; } } //end_union_set int euler(int n, int m) { memset(degree, 0, sizeof(degree)); set_inital(0, n); for (int i = 0; i < m; ++ i) { int A = set_find(E[i].point1); int B = set_find(E[i].point2); if (A != B) set_union(A, B); degree[E[i].point1] ++; degree[E[i].point2] ++; } int ans = 0, flag = 0; for (int i = 0; i < n; ++ i) { if (degree[i]) ans += (sets[i]==i); if (degree[i]%2) flag = 1; } return (ans == 1 && !flag); } int main() { int n, m; while (~scanf("%d%d",&n,&m)) { for (int i = 0; i < m; ++ i) scanf("%d%d",&E[i].point1,&E[i].point2); if (euler(n, m)) printf("Possible\n"); else printf("Not Possible\n"); } return 0; }
相关文章推荐
- 数论之 素因子分解,素数筛选法,欧拉函数和扩展欧几里得算法 (整理)
- Java enum的集合用法
- Xcode中的调试工具栏简介
- 优秀程序员的45个习惯
- BZOJ 1356 [Baltic2009]Rectangle 数学
- poj2007 Scrambled Polygon (叉积极角排序)
- Xcode中的调试工具栏简介
- Xcode中的调试工具栏简介
- ABPersonViewController不显示除了名称的属性
- javaScript在私有的属性和方法
- ***6.22-八皇后问题
- Gson源码的研读-2015/10/9
- nyoj 24 Point game 43 (dfs) 好题
- 背景色改为豆绿色
- sublime text 3中配置golang开发环境
- 文本与二进制方式打开文件的区别
- 使用Microsoft Azure Backup备份Hyper-V数据
- 使用log4j的一个工程改名后并存于一个tomcat服务器一个无法启动
- CUDA开发环境配置大全
- HDU 1556 Color the ball【线段树及lazy思想】【树状数组】