欧拉回路及其构造
2015-08-04 23:30
176 查看
欧拉回路来源于哥尼斯堡七桥问题。如下图,在当地有七座桥连接着不同的岛屿。当地人提出了一个问题:是否可以不重复地走完所有的桥。后来,欧拉解决了这个问题,并证明出:对于一个连通图,如果每一个节点的度数均为偶数,那么必然可以得到一条欧拉回路。
那么,怎么样来构造一条欧拉回路呢?这里采用的就是典型的深搜的方法。从任意一个节点开始,找到一条邻接边,对其进行标记后继续搜索。如果能够找到一条欧拉回路,那么则依次打印回路所经过的节点。如果找不到这条回路,那么则回溯到前驱点继续进行搜索。这就是fleury算法。
一道水题:POJ 2230(附代码)这道题因为题目保证一定有欧拉回路存在,所以直接用DFS处理即可(刚开始没有反应过来结果WA了好几次)
那么,怎么样来构造一条欧拉回路呢?这里采用的就是典型的深搜的方法。从任意一个节点开始,找到一条邻接边,对其进行标记后继续搜索。如果能够找到一条欧拉回路,那么则依次打印回路所经过的节点。如果找不到这条回路,那么则回溯到前驱点继续进行搜索。这就是fleury算法。
一道水题:POJ 2230(附代码)这道题因为题目保证一定有欧拉回路存在,所以直接用DFS处理即可(刚开始没有反应过来结果WA了好几次)
#include<iostream> #include<cstdio> #include<algorithm> #include<stack> #include<cstring> using namespace std; struct edge { int endi; bool visited; edge *next; edge() { visited = false; next = NULL; } }grapher[100050]; edge *head[10010]; int node_num, edge_num, e; stack<int>myrode; void addedge(int from, int to) { grapher[e].next = head[from]; grapher[e].endi = to; head[from] = &grapher[e++]; } void init() { memset(head, NULL, sizeof(head)); for (int i = 0; i <= edge_num; i++) grapher[i] = edge(); } void euler(int n, edge *mypo) { edge *pointer; for (pointer = mypo; pointer != NULL; pointer = pointer->next) { int temp = pointer->endi; if (pointer->visited == true) continue; else { pointer->visited = true; euler(temp, head[temp]); } } myrode.push(n); return; } int main() { int i; while (scanf_s("%d %d", &node_num, &edge_num) != EOF) { init(); int temp1, temp2; e = 0; for (i = 1; i <= edge_num; i++) { cin >> temp1 >> temp2; addedge(temp1, temp2); addedge(temp2, temp1); } edge_num *= 2; euler(1, head[1]); while (!myrode.empty()) { cout << myrode.top() << endl; myrode.pop(); } } return 0; }
相关文章推荐
- linux下shell脚本执行jar文件
- 加快mysql导入导出速度
- Ruby
- BeanUtils.populate的作用 !
- 一个java老菜鸟的而立之感(一)
- ps学习笔记二(矢量图)
- 【罗辑思维】物种战争
- UEditor的配置和使用(单独图片与文件上传)
- 背包算法解决一道华为面试题
- Spring 中设置依赖注入
- 对给定字符串,取出它的子字符串,并把子字符串按照长度排序
- Linux下Weblogic 11g R1安装和配置
- Leetcode: Count Primes
- 阻塞队列自定义实现 in Java
- 数组
- Linux线程同步概述
- Unity导出项目
- 没人告诉你关于z-index的一些事
- 去除字符串中的重复子字符串
- leetcode 72: Edit Distance