图--最短路径--弗洛伊德算法
2014-05-08 18:01
330 查看
算法基本思想:
1、初始化两个二维数组D[][]和P[][],D[v][w]用于表示从顶点v到顶点w的最小权和,P[v][w]表示从顶点v到顶点w需要经过顶点P[v][w],D[][]初始值为邻接矩阵,P[][]初始值为列下标;
2、遍历所有的顶点k,每个顶点又遍历D[][]中的每一个元素D[v][w],若经过v经过k到达w的路径比原先的路径短的话,将当前两点间的权值设为更小的一个,同时将P[v][w]值置为P[v][k];
3、最后要得到从v点到w点的路径为:v->P[v][w]->P[P[v][w]][w]...->e
算法时间复杂度为O(n^3)。
1、初始化两个二维数组D[][]和P[][],D[v][w]用于表示从顶点v到顶点w的最小权和,P[v][w]表示从顶点v到顶点w需要经过顶点P[v][w],D[][]初始值为邻接矩阵,P[][]初始值为列下标;
2、遍历所有的顶点k,每个顶点又遍历D[][]中的每一个元素D[v][w],若经过v经过k到达w的路径比原先的路径短的话,将当前两点间的权值设为更小的一个,同时将P[v][w]值置为P[v][k];
3、最后要得到从v点到w点的路径为:v->P[v][w]->P[P[v][w]][w]...->e
#include <stdio.h> #define MAXVEX 9 #define INFINITY 65535 typedef int Pathmatirx[MAXVEX][MAXVEX]; //用于存储最短路径下标的数组 typedef int ShortPathTable[MAXVEX][MAXVEX]; //用于存储到各点最短路径的权值和 typedef struct MGraph { int numVertexes; int arc[9][9]; }MGraph; void floyd(MGraph G,Pathmatirx *P,ShortPathTable *D) { int v,w,k; for(v=0;v<G.numVertexes;++v) //初始化D与P { for(w=0;w<G.numVertexes;++w) { (*D)[v][w]=G.arc[v][w]; //D[v][w]值即为对应点间的值 (*P)[v][w]=w; } } for(k=0;k<G.numVertexes;++k) { for(v=0;v<G.numVertexes;++v) { for(w=0;w<G.numVertexes;++w) { //如果经过k顶点路径比原来两点间路径更短,更新 if((*D)[v][w]>(*D)[v][k]+(*D)[k][w]) { (*D)[v][w]=(*D)[v][k]+(*D)[k][w]; (*P)[v][w]=(*P)[v][k]; //路径设置经过下标为k的顶点 } } } } } void main(void) { int i,j,k,b,e; MGraph G= //顶点数和权值表(行下标对应顶点到列下标对应顶点的边权值) { /*.numVertexes=*/9, //结构体初始化搞半天原来是VC不支持C99标准 /*.arc[9][9]=*/{0,1,5,INFINITY,INFINITY,INFINITY,INFINITY,INFINITY,INFINITY, 1,0,3,7,5,INFINITY,INFINITY,INFINITY,INFINITY, 5,3,0,INFINITY,1,7,INFINITY,INFINITY,INFINITY, INFINITY,7,INFINITY,0,2,INFINITY,3,INFINITY,INFINITY, INFINITY,5,1,2,0,3,6,9,INFINITY, INFINITY,INFINITY,7,INFINITY,3,0,INFINITY,5,INFINITY, INFINITY,INFINITY,INFINITY,3,6,INFINITY,0,2,7, INFINITY,INFINITY,INFINITY,INFINITY,9,5,2,0,4, INFINITY,INFINITY,INFINITY,INFINITY,INFINITY,INFINITY,7,4,0,}, }; Pathmatirx P; ShortPathTable D; /*printf("Enter the number of Vertexes:"); scanf("%d",&G.numVertexes); for(i=0;i<G.numVertexes;++i) { for(j=0;j<G.numVertexes;++j) { scanf("%d",&G.arc[i][j]); } }*/ floyd(G,&P,&D); printf("begin:"); scanf("%d",&b); printf("end:"); scanf("%d",&e); printf("weight:%d\n",D[b][e]); printf("%d",b); for(i=0;i<G.numVertexes;++i) { b=P[b][e]; printf("->%d",b); if(b == e) break; } }
算法时间复杂度为O(n^3)。
相关文章推荐
- 做网站首页制作手机端浏览的跳转
- 什么是蓝宝石玻璃屏幕?
- 设置Qt程序在Windows开机后自动运行
- 有关网卡
- 文档附件在线预览软件
- 支持向量机(SVM)(三)-- 最优间隔分类器(optimal margin classifier)
- 零关爱LV生成记.CN的成长记忆
- Linux常用命令
- C#环境下使用Windows消息传递字符串数据的研究
- jvm是什么?
- 高质量程序设计指南<C/C++语言>笔记记录
- UIScrollerView加载大量数据内存爆满的问题
- rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)
- [ios5 cocos2d游戏开发实战] 笔记3-FileUtils, notificationCenter
- Hadoop之MapReduce
- 数据库之mysql
- 异步简单例子
- 使用ATmega8L-8PU 在面包板上搭建自己的Arduino ,并闪亮一个LED
- Spark系列(2)—A Standalone App in Scala
- 使用librtmp库发布直播流