歐拉回路放了好久,一直以來就認為他就是判定+dfs,但總有個Fleury壓在心頭,今天仔細一看,不就是dfs嗎?還弄個人名做外套。
Fleury算法:
1.判定該圖是否為Euler圖,包括有向歐拉通路,有向歐拉回路,無向歐拉通路,無向歐拉回路:
有向歐拉通路:起點:出度-入度=1,終點:入度-出度=1,其它點:入度==出度
有向歐拉回路:所有點:入度==出度
無向歐拉通路:僅有兩個奇度點
無向歐拉回路:無奇度點
2.選擇起點
3.采用dfs尋找Euler路徑。
附無向圖歐拉通路(num==2)、歐拉回路(num==0)Fleury模板:
#include <iostream> #include <stdio.h> #include <string.h> #define MAXN 200 using namespace std; struct stack{ int top,node[MAXN]; }s; int Edge[MAXN][MAXN]; int n; void dfs(int x){ int i; s.top++; s.node[s.top]=x; for(i=0;i<n;i++){ if(Edge[i][x]>0){ Edge[i][x]=0; Edge[x][i]=0; dfs(i); break; } } } void Fleury(int x){ int i,b; s.top=0;s.node[s.top]=x; while(s.top>=0){ b=0; for(i=0;i<n;i++){ if(Edge[s.node[s.top]][i]>0){ b=1;break; } } if(b==0){ printf("%d ",s.node[s.top]+1); s.top--; } else{ s.top--; dfs(s.node[s.top+1]); } } printf("\n"); } int main() { freopen("in.txt","r",stdin); int i,j; int m,s,t; int degree,num,start; while(scanf("%d%d",&n,&m)!=EOF){ memset(Edge,0,sizeof(Edge)); for(i=0;i<m;i++){ scanf("%d%d",&s,&t); Edge[s-1][t-1]=1; Edge[t-1][s-1]=1; } num=0;start=0; for(i=0;i<n;i++){ degree=0; for(j=0;j<n;j++) degree+=Edge[i][j]; if(degree%2==1){ start=i; num++; } } if(num==0 || num==2) Fleury(start); else printf("No Euler path\n"); } return 0; }
Input:
9 14
1 2
1 8
2 3
2 8
2 9
3 4
4 5
4 6
4 9
5 6
6 7
6 9
7 8
8 9
Output:
1 8 9 6 7 8 2 9 4 6 5 4 3 2 1