第十三周项目四(Floyd算法实现)

来源:互联网 发布:欧美女歌手 知乎 编辑:程序博客网 时间:2024/05/01 04:16
  1.  *Copyright(c)2016,烟台大学计算机与控制工程学院   
  2.  *All right reserved.   
  3.  *文件名称:Floyd算法实现.cpp   
  4.  *作者:宋雨静  
  5.  *时间:12月8日   
  6.  *版本号;v1.0   
  7.  *问题描述:   
  8.             
  9.    Floyd算法实现   
  10.  *输入描述:带权图的邻接矩阵   
  11.  *程序输出:图中所有点之间的路径长度及其具体路径   
  12. */    
  13.   
  14. [cpp] view plain copy  
  15. #include <stdio.h>    
  16. #include <malloc.h>    
  17. #define MAXV 100                //最大顶点个数    
  18. #define INF 32767       //INF表示∞    
  19. #define MaxSize 100    
  20. typedef int InfoType;    
  21.     
  22. //以下定义邻接矩阵类型    
  23. typedef struct    
  24. {    
  25.     int no;                     //顶点编号    
  26.     InfoType info;              //顶点其他信息,在此存放带权图权值    
  27. } VertexType;                   //顶点类型    
  28.     
  29. typedef struct                  //图的定义    
  30. {    
  31.     int edges[MAXV][MAXV];      //邻接矩阵    
  32.     int n,e;                    //顶点数,弧数    
  33.     VertexType vexs[MAXV];      //存放顶点信息    
  34. } MGraph;                       //图的邻接矩阵类型    
  35.     
  36. //以下定义邻接表类型    
  37. typedef struct ANode            //弧的结点结构类型    
  38. {    
  39.     int adjvex;                 //该弧的终点位置    
  40.     struct ANode *nextarc;      //指向下一条弧的指针    
  41.     InfoType info;              //该弧的相关信息,这里用于存放权值    
  42. } ArcNode;    
  43.     
  44. typedef int Vertex;    
  45.     
  46. typedef struct Vnode            //邻接表头结点的类型    
  47. {    
  48.     Vertex data;                //顶点信息    
  49.     int count;                  //存放顶点入度,只在拓扑排序中用    
  50.     ArcNode *firstarc;          //指向第一条弧    
  51. } VNode;    
  52.     
  53. typedef VNode AdjList[MAXV];    //AdjList是邻接表类型    
  54.     
  55. typedef struct    
  56. {    
  57.     AdjList adjlist;            //邻接表    
  58.     int n,e;                    //图中顶点数n和边数e    
  59. } ALGraph;                      //图的邻接表类型    
  60. typedef struct    
  61. {    
  62.     int u;     //边的起始顶点    
  63.     int v;     //边的终止顶点    
  64.     int w;     //边的权值    
  65. } Edge;    
  66. void Ppath(int path[],int i,int v);  //前向递归查找路径上的顶点    
  67. void Dispath(int dist[],int path[],int s[],int n,int v);    
  68. void Dijkstra(MGraph g,int v);    
  69. void ArrayToMat(int *Arr, int n, MGraph &g);    
  70. void Floyd(MGraph g);    
  71. void Ppath(int path[][MAXV],int i,int j)  //前向递归查找路径上的顶点    
  72. {    
  73.     int k;    
  74.     k=path[i][j];    
  75.     if (k==-1) return;  //找到了起点则返回    
  76.     Ppath(path,i,k);    //找顶点i的前一个顶点k    
  77.     printf("%d,",k);    
  78.     Ppath(path,k,j);    //找顶点k的前一个顶点j    
  79. }    
  80. void Dispath(int A[][MAXV],int path[][MAXV],int n)    
  81. {    
  82.     int i,j;    
  83.     for (i=0; i<n; i++)    
  84.         for (j=0; j<n; j++)    
  85.         {    
  86.             if (A[i][j]==INF)    
  87.             {    
  88.                 if (i!=j)    
  89.                     printf("从%d到%d没有路径\n",i,j);    
  90.             }    
  91.             else    
  92.             {    
  93.                 printf("  从%d到%d=>路径长度:%d 路径:",i,j,A[i][j]);    
  94.                 printf("%d,",i);    //输出路径上的起点    
  95.                 Ppath(path,i,j);    //输出路径上的中间点    
  96.                 printf("%d\n",j);   //输出路径上的终点    
  97.             }    
  98.         }    
  99. }    
  100. void ArrayToMat(int *Arr, int n, MGraph &g)    
  101. {    
  102.     int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数    
  103.     g.n=n;    
  104.     for (i=0; i<g.n; i++)    
  105.         for (j=0; j<g.n; j++)    
  106.         {    
  107.             g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用    
  108.             if(g.edges[i][j]!=0)    
  109.                 count++;    
  110.         }    
  111.     g.e=count;    
  112. }    
  113. void Floyd(MGraph g)    
  114. {    
  115.     int A[MAXV][MAXV],path[MAXV][MAXV];    
  116.     int i,j,k;    
  117.     for (i=0; i<g.n; i++)    
  118.         for (j=0; j<g.n; j++)    
  119.         {    
  120.             A[i][j]=g.edges[i][j];    
  121.             path[i][j]=-1;    
  122.         }    
  123.     for (k=0; k<g.n; k++)    
  124.     {    
  125.         for (i=0; i<g.n; i++)    
  126.             for (j=0; j<g.n; j++)    
  127.                 if (A[i][j]>A[i][k]+A[k][j])    
  128.                 {    
  129.                     A[i][j]=A[i][k]+A[k][j];    
  130.                     path[i][j]=k;    
  131.                 }    
  132.     }    
  133.     Dispath(A,path,g.n);   //输出最短路径    
  134. }    
  135. int main()    
  136. {    
  137.     MGraph g;    
  138.     int A[4][4]=    
  139.     {    
  140.         {0,  5,INF,7},    
  141.         {INF,0,  4,2},    
  142.         {3,  3,  0,2},    
  143.         {INF,INF,1,0}    
  144.     };    
  145.     ArrayToMat(A[0], 4, g);    
  146.     Floyd(g);    
  147.     return 0;    
  148. }    

运行结果:

0 0
原创粉丝点击