欧拉通路和回路
Fleury算法
欧拉回路放了好久,一直以来就认为他就是判定+dfs,但总有个Fleury压在心头,今天仔细一看,不就是dfs吗?还弄个人名做外套。
Fleury算法:
1.判定该图是否为Euler图,包括有向欧拉通路,有向欧拉回路,无向欧拉通路,无向欧拉回路:
有向欧拉通路:起点:出度-入度=1,终点:入度-出度=1,其它点:入度==出度
有向欧拉回路:所有点:入度==出度
无向欧拉通路:仅有两个奇度点
无向欧拉回路:无奇度点
2.选择起点
3.采用dfs寻找Euler路径。
附无向图欧拉通路(num==2)、欧拉回路(num==0)Fleury模板:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #define MAXN 200 5 using namespace std; 6 struct stack{ 7 int top,node[MAXN]; 8 }s; 9 int Edge[MAXN][MAXN]; 10 int n; 11 void dfs(int x){ 12 int i; 13 s.top++; 14 s.node[s.top]=x; 15 for(i=0;i<n;i++){ 16 if(Edge[i][x]>0){ 17 Edge[i][x]=0; 18 Edge[x][i]=0; 19 dfs(i); 20 break; 21 } 22 } 23 } 24 void Fleury(int x){ 25 int i,b; 26 s.top=0;s.node[s.top]=x; 27 while(s.top>=0){ 28 b=0; 29 for(i=0;i<n;i++){ 30 if(Edge[s.node[s.top]][i]>0){ 31 b=1;break; 32 } 33 } 34 if(b==0){ 35 printf("%d ",s.node[s.top]+1); 36 s.top--; 37 } 38 else{ 39 s.top--; 40 dfs(s.node[s.top+1]); 41 } 42 } 43 printf("\n"); 44 } 45 int main() 46 { 47 freopen("in.txt","r",stdin); 48 int i,j; 49 int m,s,t; 50 int degree,num,start; 51 while(scanf("%d%d",&n,&m)!=EOF){ 52 memset(Edge,0,sizeof(Edge)); 53 for(i=0;i<m;i++){ 54 scanf("%d%d",&s,&t); 55 Edge[s-1][t-1]=1; 56 Edge[t-1][s-1]=1; 57 } 58 num=0;start=0; 59 for(i=0;i<n;i++){ 60 degree=0; 61 for(j=0;j<n;j++) 62 degree+=Edge[i][j]; 63 if(degree%2==1){ 64 start=i; 65 num++; 66 } 67 } 68 if(num==0 || num==2) Fleury(start); 69 else printf("No Euler path\n"); 70 } 71 return 0; 72 }