欧拉回路放了好久,一直以来就认为他就是判定+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