第十三周项目4--Floyd算法的验证

来源:互联网 发布:js qq在线客服插件 编辑:程序博客网 时间:2024/06/05 23:54
问题与代码:
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /*      
  2. * Copyright (c)2016,烟台大学计算机与控制工程学院      
  3. * All rights reserved.      
  4. * 文件名称:项目.cpp      
  5. * 作    者:PANCHUNYU      
  6. * 完成日期:2016年12月15日      
  7. * 版 本 号:v1.0       
  8. *问题描述:验证Floyd算法 
  9. *输入描述:无      
  10. *程序输出:测试数据      
  11. */       


 

头文件graph.h和源文件graph.cpp代码详见图的算法库

 

测试图如下:

 

主函数main.cpp代码

 

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:12px;">#include <stdio.h>  
  2. #include <malloc.h>  
  3. #include "graph.h"  
  4. #define MaxSize 100  
  5. void Ppath(int path[][MAXV],int i,int j)  //前向递归查找路径上的顶点  
  6. {  
  7.     int k;  
  8.     k=path[i][j];  
  9.     if (k==-1) return;  //找到了起点则返回  
  10.     Ppath(path,i,k);    //找顶点i的前一个顶点k  
  11.     printf("%d,",k);  
  12.     Ppath(path,k,j);    //找顶点k的前一个顶点j  
  13. }  
  14. void Dispath(int A[][MAXV],int path[][MAXV],int n)  
  15. {  
  16.     int i,j;  
  17.     for (i=0; i<n; i++)  
  18.         for (j=0; j<n; j++)  
  19.         {  
  20.             if (A[i][j]==INF)  
  21.             {  
  22.                 if (i!=j)  
  23.                     printf("从%d到%d没有路径\n",i,j);  
  24.             }  
  25.             else  
  26.             {  
  27.                 printf("  从%d到%d=>路径长度:%d 路径:",i,j,A[i][j]);  
  28.                 printf("%d,",i);    //输出路径上的起点  
  29.                 Ppath(path,i,j);    //输出路径上的中间点  
  30.                 printf("%d\n",j);   //输出路径上的终点  
  31.             }  
  32.         }  
  33. }  
  34. void Floyd(MGraph g)  
  35. {  
  36.     int A[MAXV][MAXV],path[MAXV][MAXV];  
  37.     int i,j,k;  
  38.     for (i=0; i<g.n; i++)  
  39.         for (j=0; j<g.n; j++)  
  40.         {  
  41.             A[i][j]=g.edges[i][j];  
  42.             path[i][j]=-1;  
  43.         }  
  44.     for (k=0; k<g.n; k++)  
  45.     {  
  46.         for (i=0; i<g.n; i++)  
  47.             for (j=0; j<g.n; j++)  
  48.                 if (A[i][j]>A[i][k]+A[k][j])  
  49.                 {  
  50.                     A[i][j]=A[i][k]+A[k][j];  
  51.                     path[i][j]=k;  
  52.                 }  
  53.     }  
  54.     Dispath(A,path,g.n);   //输出最短路径  
  55. }  
  56. int main()  
  57. {  
  58.     MGraph g;  
  59.     int A[4][4]=  
  60.     {  
  61.         {0,  5,INF,7},  
  62.         {INF,0,  4,2},  
  63.         {3,  3,  0,2},  
  64.         {INF,INF,1,0}  
  65.     };  
  66.     ArrayToMat(A[0], 4, g);  
  67.     Floyd(g);  
  68.     return 0;  
  69. }</span>  


运算结果:

 

知识点总结:

Floyd算法,基本思想是递归产生一个矩阵序列A0、A1、....、Ak、....An,其中Ak[i][j]表示从顶点i到顶点j 的路径上所经过的顶点编号不大于k的最短路径长度。

学习心得:

多练习。

0 0
原创粉丝点击