USACO 3.3.1Riding the Fences(弗罗莱算法寻找欧拉通路)
来源:互联网 发布:三国志13 甘宁数据 编辑:程序博客网 时间:2024/05/24 01:44
弗罗莱算法求欧拉通路:
Fleury算法:
任取v0∈V(G),令P0=v0;
设Pi=v0e1v1e2…ei vi已经行遍,按下面方法从中选取ei+1:
(a)ei+1与vi相关联;
(b)除非无别的边可供行遍,否则ei+1不应该为Gi=G-{e1,e2,…, ei}中的桥(所谓桥是一条删除后使连通图不再连通的边);
(c)当(b)不能再进行时,算法停止。
可以证明,当算法停止时所得的简单回路Wm=v0e1v1e2….emvm(vm=v0)为G中的一条欧拉回路,复杂度为O(e*e)。
源代码:
/*ID: supersnow0622PROG: testLANG: C++*/#include <iostream>#include <fstream>#include<memory.h>#include <string>using namespace std;int N,map[501][501],times[501],sqStack[1026],top=0,Min=555,Max=0;void dfs(int x){ int k=0; sqStack[++top]=x; for(int i=Min;i<=Max;i++) if(map[x][i]>0) { k=1; map[i][x]--;map[x][i]--; dfs(i); break; } if(k==0) { top--; int m=sqStack[top]; map[x][m]++;map[m][x]++; if(top!=N) { top--; dfs(m); }else sqStack[++top]=x; }}int main() { ofstream fout ("test.out"); ifstream fin ("test.in"); int a,b; cin>>N; memset(map,0,sizeof(map)); memset(times,0,sizeof(times)); for(int i=0;i<N;i++) { cin>>a>>b; map[a][b]++; map[b][a]++; times[a]++; times[b]++; Min=min(min(Min,a),b); Max=max(max(Max,a),b); } int start=0; for(int i=Min;i<=Max;i++) if(times[i]%2==1) { start=i;break; } if(start==0) start=Min; dfs(start); for(int i=1;i<=top;i++) cout<<sqStack[i]<<endl; return 0;}
这样写会超时间,一下是改进的算法。
源代码:/*ID: supersnow0622PROG: testLANG: C++*/#include <iostream>#include <fstream>#include<memory.h>#include <string>using namespace std;int map[501][501],times[501],sqStack[1026],top=0,Min=555,Max=0;void dfs(int start){ for(int i=Min;i<=Max;i++) if(map[start][i]>0) { map[start][i]--; map[i][start]--; dfs(i); } top++; sqStack[top]=start;}int main() { ofstream fout ("test.out"); ifstream fin ("test.in"); int N,a,b; cin>>N; memset(map,0,sizeof(map)); memset(times,0,sizeof(times)); for(int i=0;i<N;i++) { cin>>a>>b; map[a][b]++; map[b][a]++; times[a]++; times[b]++; Min=min(min(Min,a),b); Max=max(max(Max,a),b); } int start=0; for(int i=Min;i<=Max;i++) if(times[i]%2==1) { start=i;break; } if(start==0) start=Min; dfs(start); for(int i=top;i>=1;i--) cout<<sqStack[i]<<endl; return 0;}
- USACO 3.3.1Riding the Fences(弗罗莱算法寻找欧拉通路)
- USACO section 3.3 Riding the Fences(欧拉通路的遍历,dfs)
- 欧拉回路 USACO 3.3.1 Riding the Fences
- USACO Section 3.3 Riding The Fences - 欧拉回路
- USACO-Section 3.3 Riding the Fences(欧拉回路)
- Riding the Fences (USACO 3.3) 无向图欧拉通路/回路
- usaco3.3Riding the Fences输出欧拉通路
- 欧拉路径, 欧拉回路 USACO Riding the Fences
- usaco 3.3 Riding the Fences
- usaco 3.3 Riding the Fences
- USACO Riding The Fences 与欧拉路径问题
- usaco Riding the Fences(欧拉回路模板)
- USACO Riding Fences 欧拉回路
- usaco Riding the Fences
- 【USACO题库】3.3.1 Riding the Fences骑马修栅栏
- USACO 3.3 Riding The Fences (fence)
- USACO-Section 3.3-PROB Riding The Fences
- USACO: Chap3 Riding the Fences
- [LeetCode] Flatten Binary Tree to Linked List
- kmalloc与vmalloc的区别
- mysql的字符串函数
- oracle 数据泵迁移不同表空间数据
- IE 总是提示“已限制此网页运行可以访问计算机的脚本或ActiveX控件,取消办法
- USACO 3.3.1Riding the Fences(弗罗莱算法寻找欧拉通路)
- eclipse的使用配置记录
- EMC ControlCenter 6.1 install update bandle 9 failed
- 求大神解释 #define问题
- ubuntu下mysql安装路径更改及密码修改
- Excel2007之前的和Excel2003连接字符串的不同
- 简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 中秋节的来历
- COM Sink-Event 实现