弗罗莱算法求欧拉通路:
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: supersnow0622 PROG: test LANG: 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: supersnow0622 PROG: test LANG: 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; }