欧拉回路、欧拉通路的判断及求一条欧拉回路

独自空忆成欢 提交于 2020-01-25 03:17:41

欧拉回路、欧拉通路的判断及求一条欧拉回路

算法如下:

#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");
}



测试:
自己找个欧拉图试一下就行了,算法是以邻接矩阵存储的,输入边的时候要输入边对应的行和列。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!