欧拉回路或通路路径输出(Fleury算法)

在下面的代码中,首先判断是否存在回路或通路,如果存在则选择一个正确的顶点按照Fleury算法输出欧拉回路或通路



代码如下:

#include<stdio.h>
#include<string.h> 
#define MAXN 200
using namespace std;
int Edge[MAXN][MAXN];//邻接矩阵
int n;//顶点个数 
struct stack{
	int top,node[MAXN];
}s;
void dfs(int x){
	int i;
	s.top++;
	s.node[s.top]=x;
	for(i=0;i<n;i++){
	if(Edge[i][x]){
	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++){//b!=0则说明还可以扩展 
			if(Edge[s.node[s.top]][i]){
				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(){
	int i,j;
	int m,s,t;
	int degree,num,star;
	memset(Edge,0,sizeof(Edge));
	scanf("%d%d",&n,&m); 
	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;star=0;
	for(i=0;i<n;i++){
		degree=0;
		for(j=0;j<n;j++)
			degree+=Edge[i][j];
		if(degree%2==1){
			star=i;num++;
		}
	}
	if(num==0||num==2)Fleury(star);
	else printf("No Euler path\n"); 
	return 0;
}

你可能感兴趣的:(欧拉回路或通路路径输出(Fleury算法))