第十三周项目四~~Floyd算法实现
2015-11-23 16:33
363 查看
/*问题及代码 *Copyright(c)2015,烟台大学计算机学院 *All right reserved. *文件名称:Floyd算法实现.cpp *作者:李浩 *时间:11月23日 *版本号;v1.0 *问题描述: Floyd算法实现 *输入描述:带权图的邻接矩阵 *程序输出:图中所有点之间的路径长度及其具体路径 */
#include <stdio.h> #include <malloc.h> #define MAXV 100 //最大顶点个数 #define INF 32767 //INF表示∞ #define MaxSize 100 typedef int InfoType; //以下定义邻接矩阵类型 typedef struct { int no; //顶点编号 InfoType info; //顶点其他信息,在此存放带权图权值 } VertexType; //顶点类型 typedef struct //图的定义 { int edges[MAXV][MAXV]; //邻接矩阵 int n,e; //顶点数,弧数 VertexType vexs[MAXV]; //存放顶点信息 } MGraph; //图的邻接矩阵类型 //以下定义邻接表类型 typedef struct ANode //弧的结点结构类型 { int adjvex; //该弧的终点位置 struct ANode *nextarc; //指向下一条弧的指针 InfoType info; //该弧的相关信息,这里用于存放权值 } ArcNode; typedef int Vertex; typedef struct Vnode //邻接表头结点的类型 { Vertex data; //顶点信息 int count; //存放顶点入度,只在拓扑排序中用 ArcNode *firstarc; //指向第一条弧 } VNode; typedef VNode AdjList[MAXV]; //AdjList是邻接表类型 typedef struct { AdjList adjlist; //邻接表 int n,e; //图中顶点数n和边数e } ALGraph; //图的邻接表类型 typedef struct { int u; //边的起始顶点 int v; //边的终止顶点 int w; //边的权值 } Edge; void Ppath(int path[],int i,int v); //前向递归查找路径上的顶点 void Dispath(int dist[],int path[],int s[],int n,int v); void Dijkstra(MGraph g,int v); void ArrayToMat(int *Arr, int n, MGraph &g); void Floyd(MGraph g); void Ppath(int path[][MAXV],int i,int j) //前向递归查找路径上的顶点 { int k; k=path[i][j]; if (k==-1) return; //找到了起点则返回 Ppath(path,i,k); //找顶点i的前一个顶点k printf("%d,",k); Ppath(path,k,j); //找顶点k的前一个顶点j } void Dispath(int A[][MAXV],int path[][MAXV],int n) { int i,j; for (i=0; i<n; i++) for (j=0; j<n; j++) { if (A[i][j]==INF) { if (i!=j) printf("从%d到%d没有路径\n",i,j); } else { printf(" 从%d到%d=>路径长度:%d 路径:",i,j,A[i][j]); printf("%d,",i); //输出路径上的起点 Ppath(path,i,j); //输出路径上的中间点 printf("%d\n",j); //输出路径上的终点 } } } void ArrayToMat(int *Arr, int n, MGraph &g) { int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数 g.n=n; for (i=0; i<g.n; i++) for (j=0; j<g.n; j++) { g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用 if(g.edges[i][j]!=0) count++; } g.e=count; } void Floyd(MGraph g) { int A[MAXV][MAXV],path[MAXV][MAXV]; int i,j,k; for (i=0; i<g.n; i++) for (j=0; j<g.n; j++) { A[i][j]=g.edges[i][j]; path[i][j]=-1; } for (k=0; k<g.n; k++) { for (i=0; i<g.n; i++) for (j=0; j<g.n; j++) if (A[i][j]>A[i][k]+A[k][j]) { A[i][j]=A[i][k]+A[k][j]; path[i][j]=k; } } Dispath(A,path,g.n); //输出最短路径 } int main() { MGraph g; int A[4][4]= { {0, 5,INF,7}, {INF,0, 4,2}, {3, 3, 0,2}, {INF,INF,1,0} }; ArrayToMat(A[0], 4, g); Floyd(g); return 0; }
运行结果
知识点总结
此算法需要有两个矩阵完成,第一个是不断改变的权值矩阵,第二个path则是存储路径信息的矩阵,在执行的过程中两者必须要相互联系才能真正清晰的实现其算法。
学习心得
学了这四种方式已经晕菜了,还是运用的不熟练。
相关文章推荐
- vm-install 模版创建虚拟机
- Objective-C分类 (category)和扩展(Extension)
- robotframework接口测试初探1
- PATH路径出错导致任何命令都找不到解决方法
- 系统性能优化- Session丢失
- 数组
- 第十二周 - 项目2 - 操作用邻接表存储的图
- 杭电 1010 Tempter of the Bone
- ListView优化实战指南
- 思路不能太狭隘,要学他
- 【c#】——数据类型
- 十二周 项目一 图基本算法库
- 第十二周项目2——操作用邻接表存储的图
- 幻灯片横幅
- 服务器返回的list,map等类型,在JSP中取长度、取值的方法
- 调用fork并使子进程建立一个新的会话
- 分享有声小说《永恒的终结》
- [Servlet]HttpSession的事件监听、HttpServletRequest的事件监听
- Android "120秒后重新获取"
- 修改驱动程序,解决“inf文件中找不到所需的段落”的问题