图的遍历大神的代码

#include<stdio.h>
#include<stdlib.h>
#define MAXINT 5000
#define VEX_NUM 7
#define ARC_NUM 10
typedef  struct {
     char  vexs[VEX_NUM];
     int  arcs[VEX_NUM][VEX_NUM];
     }Mgraph;
void  creat_Mgraph(Mgraph *G);
void  Dijkstra(Mgraph Gn, int  v, int  path[], int  dist[]);
void  Putpath( int  v, int  p[], int  d[]);
void  printpath( int  v, int  u, int  p[], int  d[]);
main()
{
         char  city[7][20]={ "beijing" , "xian" , "zhengzhou" , "xuzhou" , "chengdu" , "guangzhou" , "shanghai" };
     Mgraph Gn;
     int  i,m,n;
     int  path[VEX_NUM],dist[VEX_NUM];
     char  s[4];
     for (;;)
     {
         printf ( "1.建立交通图的存储结构\n" );
         printf ( "2.求某城市到所有城市的最短路径\n" );
         printf ( "3.求任意两个城市之间的最短路径\n" );
         printf ( "4.退出\n" );
         gets (s);
         switch (*s)
         {
           case '1' :creat_Mgraph(&Gn);
               break ;
           case '2' : printf ( "请输入城市:\n" );
               scanf ( "%d" ,&i);
               Dijkstra(Gn,i,path,dist);
               Putpath(i,path,dist);
               break ;
           case '3' : printf ( "请输入城市:\n" );
               scanf ( "%d,%d" ,&m,&n);
               Dijkstra(Gn,m,path,dist);
               printpath(m,n,path,dist);
               break ;
           case '4' : exit (0);
               break ;
         }
     }
}
void  creat_Mgraph(Mgraph *G)
{
         int  i,j,k,w;
         printf ( "\n inuput vextex:" );
         for (i=0;i<VEX_NUM;i++)
              scanf ( "%c" ,&G->vexs[i]);
         for (i=0;i<VEX_NUM;i++)
         for (j=0;j<VEX_NUM;j++)
              G->arcs[i][j]=MAXINT;
         printf ( "\n input edge(i,j,w):\n" );
         for (k=1;k<=ARC_NUM;k++)
         {
             scanf ( "%d,%d,%d" ,&i,&j,&w);
             G->arcs[i][j]=w;
             G->arcs[j][i]=w;
         }
}
void  Putpath( int  v, int  p[], int  d[])
{
         int  i,j,next;
         for (i=0;i<VEX_NUM;i++)
           if (d[i]<MAXINT&&i!=v)
           {
             printf ( "%c<--" ,city[i]);
             next=p[i];
             while (next!=v)
             {
                 printf ( "%c<--" ,city[next]);
                 next=p[next];
             }
             printf ( "%c:%d\n" ,city[v],d[i]);
           }
}
void  printpath( int  v, int  u, int  p[], int  d[])
{
      int  i,j,next;
      for (i=0;i<VEX_NUM;i++)
     if (d[i]<MAXINT&&i==u)
         {  
             printf ( "%c<--" ,city[i]);
             next=p[i];
             while (next!=v)
             {  
                  printf ( "%c<--" ,city[next]);
              next=p[next];
             }
              printf ( "%c:%d\n" ,city[v],d[i]);
         }
}
            
void  Dijkstra(Mgraph Gn, int  v, int  path[], int  dist[])
{
     int  i,j,w,k,min;
     int  s[VEX_NUM];
     for (j=0;j<VEX_NUM;j++)
     {
         s[j]=0;
         dist[j]=Gn.arcs[v][j];
         if (dist[j]<MAXINT)
             path[j]=v;
         else
             path[j]=-1;
     }
     dist[v]=0;
     s[v]=1;
     for (i=0;i<VEX_NUM;i++)
     {
         min=MAXINT;
         for (w=0;w<VEX_NUM;w++)
             if (!s[w]&&dist[w]<min)
             {
                 j=w;
                 min=dist[w];
             }
             s[j]=1;
             for (k=0;k<VEX_NUM;k++)
                 if (!s[k]&&(min+Gn.arcs[j][k]<dist[k]))
                 {
                     dist[k]=min+Gn.arcs[j][k];
                     path[k]=j;
                 }
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值