最短路径(Dijkstra)

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define OK 1
  4 #define TRUE 1
  5 #define FALSE 0
  6 #define ERROR -1
  7 #define OVERFLOW -2
  8 #define INFINITY 65535 
  9 #define MAX_VERTEX_NUM 10
 10 typedef int Status;
 11 typedef char TreeType;
 12 int P[MAX_VERTEX_NUM];//用于存放最短路径,P[i]存放i的前驱结点序号 
 13 int D[MAX_VERTEX_NUM];//用于存放当前所求最短路径 
 14 //定义邻接矩阵数据结构
 15 typedef struct
 16 {
 17     TreeType vexs[MAX_VERTEX_NUM];
 18     int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
 19     int vexnum,arcnum;
 20 }MGraph;
 21 Status CreateMGraph(MGraph &G)//构造一个图型存储结构
 22 {
 23     int i,j,k;
 24     puts("请输入构成图的顶点个数和边数:"); 
 25     scanf("%d%d%*c",&G.vexnum,&G.arcnum);
 26     puts("请输入顶点数值:"); 
 27     for(i=0;i<G.vexnum;i++)
 28        scanf("%c",&G.vexs[i]);
 29     for(i=0;i<G.vexnum;i++)
 30         for(j=0;j<G.vexnum;j++)
 31         if(i==j) G.arc[i][j]=0;
 32         else G.arc[i][j]=INFINITY;
 33     puts("请依次输入边(Vi,Vj)的顶点序号及权值:");
 34     for(k=0;k<G.arcnum;k++)
 35     {
 36         scanf("%d%d",&i,&j);
 37         scanf("%d",&G.arc[i][j]);
 38         G.arc[j][i]=G.arc[i][j];
 39     }
 40     return OK;
 41 }
 42 Status ShortPath_Dijkstra(MGraph G,int v0)
 43 {
 44      int v,w,k,min;
 45      int final[MAX_VERTEX_NUM];
 46      for(v=0;v<G.vexnum;v++)
 47      {
 48             final[v]=0;
 49             D[v]=G.arc[v0][v];
 50             P[v]=0;
 51      }
 52      D[v0]=0;
 53      final[v0]=1;
 54      for(v=1;v<G.vexnum;v++)
 55      {
 56             min=INFINITY;
 57             for(w=0;w<G.vexnum;w++)
 58             {
 59                 if(!final[w]&&D[w]<min)
 60                 {
 61                     k=w;
 62                     min=D[w];
 63                 }
 64             }
 65             final[k]=1;
 66             for(w=0;w<G.vexnum;w++)
 67             {
 68                 if(!final[w]&&(min+G.arc[k][w]<D[w]))
 69                 {
 70                     D[w]=min+G.arc[k][w];
 71                     P[w]=k;
 72                 }
 73             }
 74      }
 75      return OK;
 76 }
 77 //主函数 
 78 Status main()
 79 {
 80     MGraph G;
 81     int i,j,k,v0;
 82     TreeType Pathvex[MAX_VERTEX_NUM];
 83     CreateMGraph(G);
 84     printf("请输入你要求的最短路径的起点序号:");
 85     scanf("%d",&v0);
 86     ShortPath_Dijkstra(G,v0);
 87     for(i=0;i<G.vexnum;++i)
 88     {
 89         if(i==v0) continue;
 90         printf("从到%c到%c的最短路径为:",G.vexs[v0],G.vexs[i]);
 91         for(k=0,j=i;j!=v0;j=P[j])
 92             Pathvex[k++]=G.vexs[j];
 93         Pathvex[k++]=G.vexs[v0];
 94         while(k)
 95             printf("%c ",Pathvex[--k]);
 96         printf("\n最短路径长度为:%d\n\n",D[i]);
 97     }
 98     system("pause");
 99     return OK; 
100 }

posted on 2012-08-03 09:19  mycapple  阅读(271)  评论(0编辑  收藏  举报

导航