运用Floyd算法求得带权有向图任意两点间的最短路径C/C++
来源:互联网 发布:如何设置java环境变量 编辑:程序博客网 时间:2024/05/22 00:08
一、 算法过程
1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。
把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i][j]=d,d表示该路的长度;否则G[i][j]=无穷大。定义一个矩阵D用来记录所插入点的信息,D[i][j]表示从Vi到Vj需要经过的点,初始化D[i][j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i][j] = min( G[i][j], G[i][k]+G[k][j] ),如果G[i][j]的值变小,则D[i][j]=k。在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。
比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。
二、算法实现
/* *Floyd算法求得带权有向图任意两点间的最短路径 */#include<stdio.h>#include<malloc.h>#define MaxVertexNum 50#define MAX 9999typedef char VertexType ;typedef int EdgeType ;/* *定义图的存储结构 */typedef struct{ VertexType vexs[MaxVertexNum][3] ; //定义顶点表 EdgeType edges[MaxVertexNum][MaxVertexNum] ; //定义边表 int n , e ; //定义顶点数与边数} MGraph ;/* *构建图邻接矩阵 */void CreateMGraph(MGraph *G){ int i , j , k , w ; printf("请输入定点数与边数(输入格式为:顶点数,边数):") ; scanf("%d,%d" , &G->n , &G->e) ; printf("请输入顶点信息(输入格式为:顶点号<CR>):\n") ; for(i = 0 ; i < G->n ; i++) { scanf("%s" , G->vexs[i]) ; } //初始化邻接矩阵 for(i = 0 ; i < G->n ; i++) { for(j = 0 ; j < G->n ; j++) { if(i == j) { G->edges[i][j] = 0 ; }else { G->edges[i][j] = MAX ; } } } printf("请输入每条边对应的两个顶点序号以及权值(输入格式为:i,j,w):\n") ; for(k = 0 ; k < G->e ; k++) { scanf("%d,%d,%d" , &i , &j , &w) ; G->edges[i][j] = w ; } for(i = 0 ; i < G->n ; i++) { for(j = 0 ; j < G->n ; j++) { printf("%04d " , G->edges[i][j]) ; } printf("\n") ; }}void ShortestPath_2(MGraph G , int P[MaxVertexNum][MaxVertexNum][MaxVertexNum] , int D[MaxVertexNum][MaxVertexNum]){ int i , u , v , w ; for(v = 0 ; v < G.n ; v++) { for(w = 0 ; w < G.n ; w++) { D[v][w] = G.edges[v][w] ; for(u = 0 ; u < G.n ; u++) { P[v][w][u] = 0 ; //进行路径的初始化 } if(D[v][w] < MAX) { P[v][w][u] = 1 ; } } } for(u = 0 ; u < G.n ; u++) { for(v = 0 ; v < G.n ; v++) { for(w = 0 ; w < G.n ; w++) { if(D[v][u] + D[u][w] < D[v][w]) //从v经u到w的一条路径更短 { D[v][w] = D[v][u] + D[u][w] ; for(i = 0 ; i < G.n ; i++) { P[v][w][i] = P[v][u][i] || P[u][w][i] ; //更新路径 } } } } } }/* *测试代码 */void main(){ MGraph *G ; int i , j , v , w ; int P[MaxVertexNum][MaxVertexNum][MaxVertexNum] , D[MaxVertexNum][MaxVertexNum] ; G = (MGraph*)malloc(sizeof(MGraph)) ; CreateMGraph(G) ; ShortestPath_2(*G , P , D) ; for(v = 0 ; v < G->n ; v++) { for(w = 0 ; w < G->n ; w++) { printf("%04d " , D[v][w]) ; } printf("\n") ; }}
0 0
- 运用Floyd算法求得带权有向图任意两点间的最短路径C/C++
- floyd算法(求任意两点间的最短路径)
- Floyd算法(任意两点间的最短路径)
- POJ 2139-- 最短路径 (floyd算法,任意两点间的最短路径)
- C语言实现图的最短路径Floyd算法
- 任意两点间的最短路径---floyd_warshall算法
- 图两点间的最短路径,所有路径算法C语言实现
- 任意两点之间的最短路径问题(Floyd-Warshall算法)
- 任意两点之间的最短路径问题(Floyd算法)--Java语言
- 任意两点间的最短路径
- 有向图的最短路径(Floyd算法)
- 无向网图的最短路径--Floyd算法
- 求有向网中任意一对顶点之间的最短路径 Floyd算法
- Dijkstra [迪杰斯特拉]算法思路(求单点到其他每个点的各个最短路径)Floyd算法:任意两点间最短距离
- Floyd(求图中任意两点最短路径)
- AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
- Dijkstra单源最短路径实现 及 Floyd任意两点之间的最短路径
- 根据图的内容能够求出a,b,c,d,e任意两点间的最长路径和最短路径
- 何志丹简历
- 防止handler内存泄漏问题
- 通过angular.element,转变成jquery对象,改变样式!
- Android 6.0出现的init: cannot execve(‘XXX’):Permission denied问题:禁止SELINUX的权限设置
- poj 1321 棋盘问题(dfs)
- 运用Floyd算法求得带权有向图任意两点间的最短路径C/C++
- 1008. Elevator (20)
- socket阻塞与非阻塞,同步与异步、I/O模型
- [c++]Leetcode #7 reverse number
- 数据结构===》栈和队列(复习心得)
- UFLDL Exercise:Sparse Autoencoder
- SLAM方法汇总
- 【英语】11月考研英语的愤怒!
- R语言-字符串处理