最短路径(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 }

你可能感兴趣的:(dijkstra)