南邮离散大作业欧拉回路

估计看这篇博客的人都是南邮的学生,都知道要求(随机生成矩阵可以选择是无向图还是有向图,我这是无向图,然后判断欧拉回路还是欧拉道路,打印路径)直接上代码....

关于欧拉回路的详细介绍在我以前的博客有过详细的说明http://blog.csdn.net/fengsigaoju/article/details/47210177(有向图)无向图http://blog.csdn.net/fengsigaoju/article/details/47190233

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int s[50][50];
int path[50];
int n,m;
void print(int x,int path[50],int ans)
{
   int i;
   if (ans==m)
   {
    for (i=0;i<m;i++)
      printf("%d->%d  ",path[i],path[i+1]);
      printf("\n");
   }
    for (i=1;i<=n;i++)
    if (s[x][i])
    {
        s[x][i]=0;
        s[i][x]=0;
        path[++ans]=i;
        print(i,path,ans);
        ans--;//注意不仅这条边不能加进去,要撤回,算到第几条边也要撤回
        s[x][i]=1;
        s[i][x]=1;
    }
}
void DFS(int x,int book[])
{
    int i,j;
    for (i=1;i<=n;i++)
    {
        if ((s[x][i])&&(!book[i]))
        {
            book[i]=1;
            DFS(i,book);
        }
    }
}
int panduan()
{
    int i;
    int book[50];
    memset(book,0,sizeof(book));
    book[1]=1;
    DFS(1,book);
    for (i=1;i<=n;i++)
        if (!book[i])
        return 0;
        return 1;
}
 int main()
 {
     int  count,x,y,i,j,start;
     int degree[50];
     int visit[50][50];
     printf("请输入点数和边数\n");
     while(scanf("%d%d",&n,&m)&&m>n*(n-1)/2)//简单图边数最多为完全图的情况
     {
         printf("请输入正确的点数和边数\n");
     }
     count=0;
     srand(time(0));
     memset(s,0,sizeof(s));
     memset(degree,0,sizeof(degree));
     while(count<m)//随机生成合理的横纵坐标
    {
          x=rand()%n+1;//1~n个点
          y=rand()%n+1;
          if ((x<y)&&(!s[x][y]))
          {
            count++;
            s[x][y]=1;
            degree[y]++;
            degree[x]++;
          }
     }
    for (i=1;i<=n;i++)
    for (j=1;j<i;j++)
    s[i][j]=s[j][i];//记录下另一半
    for (i=1;i<=n;i++)
    {
    for (j=1;j<=n;j++)
     printf("%3d",s[i][j]);
     printf("\n");
    }
    count=0;
    for (i=1;i<=n;i++)
    if ((degree[i]%2)!=0)
    {
        count++;
        start=i;//如果个数是奇数,那么就要从start开始
    }
   if ((count!=2)&&(count!=0))
    {
    printf("不是半欧拉图,当然也不是欧拉图\n");
    return 0;
    }
    if (!panduan())//如果图不联通
    {
        printf("不是半欧拉图,当然也不是欧拉图\n");
        return 0;
    }
    if (panduan()&&count==0)//如果图联通并且度数全为偶数
    {
        printf("是欧拉图\n");
        printf("路径为:\n");
        path[0]=1;
        print(1,path,0);
        return 0;
    }
    if (panduan()&&count==2)
    {
        printf("是半欧拉图\n");
        printf("路径为:\n");
        path[0]=start;
        print(start,path,0);
        return 0;
    }
    return 0;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值