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

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

算法如下:

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



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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值