第十三周项目4每对顶点之间的最短路径

  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[][MAXV],int i,int j)  //前向递归查找路径上的顶点  
  17. {  
  18.     int k;  
  19.     k=path[i][j];  
  20.     if (k==-1) return;  //找到了起点则返回  
  21.     Ppath(path,i,k);    //找顶点i的前一个顶点k  
  22.     printf("%d,",k);  
  23.     Ppath(path,k,j);    //找顶点k的前一个顶点j  
  24. }  
  25. void Dispath(int A[][MAXV],int path[][MAXV],int n)  
  26. {  
  27.     int i,j;  
  28.     for (i=0; i<n; i++)  
  29.         for (j=0; j<n; j++)  
  30.         {  
  31.             if (A[i][j]==INF)  
  32.             {  
  33.                 if (i!=j)  
  34.                     printf("从%d到%d没有路径\n",i,j);  
  35.             }  
  36.             else  
  37.             {  
  38.                 printf("  从%d到%d=>路径长度:%d 路径:",i,j,A[i][j]);  
  39.                 printf("%d,",i);    //输出路径上的起点  
  40.                 Ppath(path,i,j);    //输出路径上的中间点  
  41.                 printf("%d\n",j);   //输出路径上的终点  
  42.             }  
  43.         }  
  44. }  
  45. void Floyd(MGraph g)  
  46. {  
  47.     int A[MAXV][MAXV],path[MAXV][MAXV];  
  48.     int i,j,k;  
  49.     for (i=0; i<g.n; i++)  
  50.         for (j=0; j<g.n; j++)  
  51.         {  
  52.             A[i][j]=g.edges[i][j];  
  53.             path[i][j]=-1;  
  54.         }  
  55.     for (k=0; k<g.n; k++)  
  56.     {  
  57.         for (i=0; i<g.n; i++)  
  58.             for (j=0; j<g.n; j++)  
  59.                 if (A[i][j]>A[i][k]+A[k][j])  
  60.                 {  
  61.                     A[i][j]=A[i][k]+A[k][j];  
  62.                     path[i][j]=k;  
  63.                 }  
  64.     }  
  65.     Dispath(A,path,g.n);   //输出最短路径  
  66. }  
  67. int main()  
  68. {  
  69.     MGraph g;  
  70.     int A[4][4]=  
  71.     {  
  72.         {0,  5,INF,7},  
  73.         {INF,0,  4,2},  
  74.         {3,  3,  0,2},  
  75.         {INF,INF,1,0}  
  76.     };  
  77.     ArrayToMat(A[0], 4, g);  
  78.     Floyd(g);  
  79.     return 0;  
  80. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用动态规划法求解最路径的C++程序实现: ```cpp #include <iostream> #include <vector> #include <limits> using namespace std; const int INF = numeric_limits<int>::max(); // 无穷大 int main() { // 邻接矩阵表示有向带权图 vector<vector<int>> graph = { {0, 1, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF}, {INF, 0, 1, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF}, {INF, INF, 0, 1, INF, INF, INF, INF, INF, INF, INF, INF, INF}, {INF, INF, INF, 0, 1, INF, INF, INF, INF, INF, INF, INF, INF}, {INF, INF, INF, INF, 0, 1, INF, INF, INF, INF, INF, INF, INF}, {INF, INF, INF, INF, INF, 0, 1, INF, INF, INF, INF, INF, INF}, {INF, INF, INF, INF, INF, INF, 0, 1, INF, INF, INF, INF, INF}, {INF, INF, INF, INF, INF, INF, INF, 0, 1, INF, INF, INF, INF}, {INF, INF, INF, INF, INF, INF, INF, INF, 0, 1, INF, INF, INF}, {INF, INF, INF, INF, INF, INF, INF, INF, INF, 0, 1, INF, INF}, {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 0, 1, INF}, {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 0, 1}, {INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, INF, 0} }; // 动态规划求解最路径 int n = graph.size(); vector<int> dist(n, INF); dist[0] = 0; // 起点到自身的距离为0 for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { if (graph[j][i] != INF) { // 存在一条从j到i的边 dist[i] = min(dist[i], dist[j] + graph[j][i]); } } } // 输出结果 cout << "0到12的最路径长度为:" << dist[12] << endl; return 0; } ``` 这个程序使用了邻接矩阵来表示有向带权图,其中INF表示两个顶点之间不存在边。动态规划求解最路径的核心代码在第13-18行,其中dist[i]表示顶点0到顶点i的最路径长度。最后输出dist[12]即为顶点0到顶点12的最路径长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值