欧拉回路、欧拉通路的判断及求一条欧拉回路
算法如下:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int Warshell(int** AdjMarix,int n){warshell求连通性
int i,j;
int AdjM[n][n];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(AdjMarix[i][j]||i==j)
AdjM[i][j]=1;
else
AdjM[i][j]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(AdjM[j][i]==1){
for(int k=0;k<n;k++){
if(AdjM[i][k])
AdjM[j][k]=1;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
if(!AdjM[i][j])
return 0;
}
return 1;
}
int Warshell1(int** AdjMarix,int n,int *hasEdge){//warshell求连通性(不算没有边的情况)
int i,j;
int AdjM[n][n];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(AdjMarix[i][j]||i==j)
AdjM[i][j]=1;
else
AdjM[i][j]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(AdjM[j][i]==1){
for(int k=0;k<n;k++){
if(AdjM[i][k])
AdjM[j][k]=1;
}
}
for(i=0;i<n;i++){
if(hasEdge[i])
for(j=0;j<n;j++)
if(!AdjM[i][j]&&hasEdge[j])
return 0;
}
return 1;
}
int oulaGraph_judge(int** Mar,int n){
int sum;
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++)
if(Mar[i][j]==1&&i!=j)
sum++;
if(sum%2){//有奇数度
printf("不是欧拉图\n");
return 0;
}
}
printf("是欧拉图,所以也是半欧拉图\n");
return 1;
}
int halfOulaGraph_judge(int** Mar,int n){
int SUM=0;
int sum;
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++)
if(Mar[i][j]==1&&i!=j)
sum++;
if(sum%2)//如果是奇数度
SUM++;
}
if(SUM!=2){//奇数度不为2个
printf("不是半欧拉图\n");
return 0;
}
printf("是半欧拉图\n");
return 1;
}
void Fleury(int** Mar,int n){//Fleury算法(自己写的,但思想是一样)
int **num=(int * *)malloc(n*sizeof(int*));
int visited[n];
int hasEdge[n];
for(int i=0;i<n;i++){//初始化
visited[i]=0;
hasEdge[i]=1;
}
for(int i=0;i<n;i++){
num[i]=(int *)malloc(n*sizeof(int));
for(int j=0;j<n;j++)
num[i][j]=Mar[i][j];
}
int flag=1;
printf("1");
visited[0]=1;
int i=0;
int FLAG;
while(flag<n){
for(int j=0;j<n;j++)
if(num[i][j]){
num[i][j]=num[j][i]=0;
FLAG=0;
for(int k=0;k<n;k++)
if(num[i][k])
FLAG=1;
if(!FLAG)
hasEdge[i]=0;
if(Warshell1(num,n,hasEdge)){
if(!visited[j]){
printf("->%d",j+1);
visited[j]=1;
flag++;
}
i=j;
j=n;
}
else {
num[i][j]=num[j][i]=1;
}
}
}
printf("->1");
}
int main(){
int edge_num,node_num;
int **Matrix;
printf("请输入点数:");
scanf("%d",&node_num);
printf("请输入边数:");
scanf("%d",&edge_num);
Matrix=(int**)malloc(node_num*sizeof(int*));
for(int i=0;i<node_num;i++){
Matrix[i]=(int*)malloc(node_num*sizeof(int));
int j=-1;
while(++j<node_num)
Matrix[i][j]=0;
}
printf("输入各边:\n");
int m,n;
for(int i=0;i<edge_num;i++){
scanf("%d%d",&m,&n);
if(m>node_num-1||n>node_num-1){
printf("out of boundary!\n");
system("pause");
exit(1);
}
Matrix[m][n]=Matrix[n][m]=1;
}
if(Warshell(Matrix,node_num)&&oulaGraph_judge(Matrix,node_num))
Fleury(Matrix,node_num);
else if(Warshell(Matrix,node_num)&&halfOulaGraph_judge(Matrix,node_num));
system("pause");
}
测试:
自己找个欧拉图试一下就行了,算法是以邻接矩阵存储的,输入边的时候要输入边对应的行和列。