第十三周 项目3从一个顶点到其余各顶点的最短路径

来源:互联网 发布:codeblocks c语言 编辑:程序博客网 时间:2024/06/05 23:52
  1. /* 
  2. Copyright (c)2016,烟台大学计算机与控制工程学院 
  3. All rights reserved. 
  4. 文件名称:图(2).cpp 
  5. 作    者:   陈朋 
  6. 完成日期:2016年12月2日 
  7. 版 本 号:v1.0 
  8. 问题描述: 
  9. 输入描述:无 
  10. 程序输出:若干 
  11. */  
  12. #include <stdio.h>  
  13. #include <malloc.h>  
  14. #include "graph.h"  
  15. #define MaxSize 100  
  16. void Ppath(int path[],int i,int v)  //前向递归查找路径上的顶点  
  17. {  
  18.     int k;  
  19.     k=path[i];  
  20.     if (k==v)  return;          //找到了起点则返回  
  21.     Ppath(path,k,v);            //找顶点k的前一个顶点  
  22.     printf("%d,",k);            //输出顶点k  
  23. }  
  24. void Dispath(int dist[],int path[],int s[],int n,int v)  
  25. {  
  26.     int i;  
  27.     for (i=0; i<n; i++)  
  28.         if (s[i]==1)  
  29.         {  
  30.             printf("  从%d到%d的最短路径长度为:%d\t路径为:",v,i,dist[i]);  
  31.             printf("%d,",v);    //输出路径上的起点  
  32.             Ppath(path,i,v);    //输出路径上的中间点  
  33.             printf("%d\n",i);   //输出路径上的终点  
  34.         }  
  35.         else  printf("从%d到%d不存在路径\n",v,i);  
  36. }  
  37. void Dijkstra(MGraph g,int v)  
  38. {  
  39.     int dist[MAXV],path[MAXV];  
  40.     int s[MAXV];  
  41.     int mindis,i,j,u;  
  42.     for (i=0; i<g.n; i++)  
  43.     {  
  44.         dist[i]=g.edges[v][i];      //距离初始化  
  45.         s[i]=0;                     //s[]置空  
  46.         if (g.edges[v][i]<INF)      //路径初始化  
  47.             path[i]=v;  
  48.         else  
  49.             path[i]=-1;  
  50.     }  
  51.     s[v]=1;  
  52.     path[v]=0;              //源点编号v放入s中  
  53.     for (i=0; i<g.n; i++)               //循环直到所有顶点的最短路径都求出  
  54.     {  
  55.         mindis=INF;                 //mindis置最小长度初值  
  56.         for (j=0; j<g.n; j++)       //选取不在s中且具有最小距离的顶点u  
  57.             if (s[j]==0 && dist[j]<mindis)  
  58.             {  
  59.                 u=j;  
  60.                 mindis=dist[j];  
  61.             }  
  62.         s[u]=1;                     //顶点u加入s中  
  63.         for (j=0; j<g.n; j++)       //修改不在s中的顶点的距离  
  64.             if (s[j]==0)  
  65.                 if (g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j])  
  66.                 {  
  67.                     dist[j]=dist[u]+g.edges[u][j];  
  68.                     path[j]=u;  
  69.                 }  
  70.     }  
  71.     Dispath(dist,path,s,g.n,v);     //输出最短路径  
  72. }  
  73.   
  74. int main()  
  75. {  
  76.     MGraph g;  
  77.     int A[7][7]=  
  78.     {  
  79.         {0,4,6,6,INF,INF,INF},  
  80.         {INF,0,1,INF,7,INF,INF},  
  81.         {INF,INF,0,INF,6,4,INF},  
  82.         {INF,INF,2,0,INF,5,INF},  
  83.         {INF,INF,INF,INF,0,INF,6},  
  84.         {INF,INF,INF,INF,1,0,8},  
  85.         {INF,INF,INF,INF,INF,INF,0}  
  86.     };  
  87.     ArrayToMat(A[0], 7, g);  
  88.     Dijkstra(g,0);  
  89.     return 0;  
  90. }  



0 0
原创粉丝点击