最短路径算法----floyd(转)
一.Floyd算法
假设从i到j的最短路径上要经过若干个顶点,这些中间顶点中最大的顶点编号为k,最小的顶点为t,因此要求算dist[i][j]的最小值,那么只需要求算dist[i][s]+dist[s][j](t<=s<=k)的所有值,并取其中最小者即可。因此可以设置一个中间顶点k(0<=k<n)分别插入到每队顶点(i,j)之中,并更新dist[i][j]的值。当n个顶点插入到每队顶点之中,求解便结束了。其实Floyd算法实质上是一个动态规划算法。
1 /*每对顶点之间最短路径Floyd 2011.8.27*/
2
3 #include <iostream>
4 #include <stack>
5 #define M 100
6 #define N 100
7 using namespace std;
8
9 typedef struct node
10 {
11 int matrix[N][M]; //邻接矩阵
12 int n; //顶点数
13 int e; //边数
14 }MGraph;
15
16 void FloydPath(MGraph g,int dist[N][M],int path[N][M])
17 {
18 int i,j,k;
19 for(i=0;i<g.n;i++)
20 for(j=0;j<g.n;j++)
21 {
22 if(g.matrix[i][j]>0)
23 {
24 dist[i][j]=g.matrix[i][j];
25 path[i][j]=i;
26 }
27 else
28 {
29 if(i!=j)
30 {
31 dist[i][j]=INT_MAX;
32 path[i][j]=-1;
33 }
34 else
35 {
36 dist[i][j]=0;
37 path[i][j]=i;
38 }
39 }
40 }
41 for(k=0;k<g.n;k++) //中间插入点(注意理解k为什么只能在最外层)
42 for(i=0;i<g.n;i++)
43 for(j=0;j<g.n;j++)
44 {
45 if((dist[i][k]>0&&dist[i][k]<INT_MAX)&& //防止加法溢出
46 (dist[k][j]>0&&dist[k][j]<INT_MAX)&&
47 dist[i][k]+dist[k][j]<dist[i][j])
48 {
49 dist[i][j]=dist[i][k]+dist[k][j];
50 path[i][j]=path[k][j]; //path[i][j]记录从i到j的最短路径上j的前一个顶点
51 }
52 }
53 }
54
55 void showPath(int path[N][M],int s,int t) //打印出最短路径
56 {
57 stack<int> st;
58 int v=t;
59 while(t!=s)
60 {
61 st.push(t);
62 t=path[s][t];
63 }
64 st.push(t);
65 while(!st.empty())
66 {
67 cout<<st.top()<<" ";
68 st.pop();
69 }
70
71 }
72
73 int main(int argc, char *argv[])
74 {
75 int e,n;
76 while(cin>>e>>n&&e!=0)
77 {
78 int i,j;
79 int s,t,w;
80 MGraph g;
81 int dist[N][M],path[N][M];
82 g.n=n;
83 g.e=e;
84 for(i=0;i<g.n;i++)
85 for(j=0;j<g.n;j++)
86 g.matrix[i][j]=0;
87 for(i=0;i<e;i++)
88 {
89 cin>>s>>t>>w;
90 g.matrix[s][t]=w;
91 }
92 FloydPath(g,dist,path);
93 for(i=0;i<g.n;i++)
94 for(j=0;j<g.n;j++)
95 {
96 if(dist[i][j]>0&&dist[i][j]<INT_MAX)
97 {
98 showPath(path,i,j);
99 cout<<dist[i][j]<<endl;
100 }
101 }
102 }
103 return 0;
104 }
(转)http://www.cnblogs.com/dolphin0520/archive/2011/08/27/2155542.html
最短路径算法----floyd(转)的更多相关文章
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
几大最短路径算法比较 转自:http://blog.csdn.net/v_july_v/article/details/6181485 几个最短路径算法的比较: Floyd 求多 ...
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较(转)
几大最短路径算法比较 几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3). Floy ...
- 多源最短路径算法—Floyd算法
前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...
- 图的最短路径算法-- Floyd算法
Floyd算法求的是图的任意两点之间的最短距离 下面是Floyd算法的代码实现模板: ; ; // maxv为最大顶点数 int n, m; // n 为顶点数,m为边数 int dis[maxv][ ...
- 最短路径算法——Dijkstra算法与Floyd算法
转自:https://www.cnblogs.com/smile233/p/8303673.html 最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1 ADE:2 ...
- 几大最短路径算法比较(Floyd & Dijkstra & Bellman-Ford & SPFA)
几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3). Floyd-Warshall算法(Floyd ...
- 最短路径---Dijkstra/Floyd算法
1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...
- Floyd最短路径算法
看完这篇文章写的小程序,Floyd最短路径算法,求从一个点到另一个点的最短距离,中间可以经过其他任意个点.三个for循环,从i到j依次经过k的最短距离,最外层for循环是经过点K,内部两个循环是从i( ...
- 经典问题----最短路径(Floyd弗洛伊德算法)(HDU2066)
问题简介: 给定T条路,S个起点,D个终点,求最短的起点到终点的距离. 思路简介: 弗洛伊德算法即先以a作为中转点,再以a.b作为中转点,直到所有的点都做过中转点,求得所有点到其他点的最短路径,Flo ...
随机推荐
- [ 9.12 ]CF每日一题系列—— 960B暴力数组
Description: 给你两个数组,顺序一定,问你第一个数组连续的几个值等于下一个数组连续的几个值,然后寻找这个值得最大值,也就是满足就换 Solution: 用两个变量索引,判断即可 #incl ...
- 点聚weboffice插件自定义菜单
https://blog.csdn.net/u014547764/article/details/53818637 1.在jsp中引用excel插件:首先项目中要有:WebOffice.zip.web ...
- Android常用库和插件
下拉刷新 PullLoadMoreRecyclerView 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性.网格.瀑布流效果演示 https://github.co ...
- 开源 PetaPoco 扩展~一个小型轻巧的ORM~
PetaPoco http://www.toptensoftware.com/petapoco/ |PetaPoco is a tiny, fast, single-file micro-ORM fo ...
- Android TV 开发(5)
本文来自网易云社区 作者:孙有军 问题3:TV launcher中没有入口图标 如果需要出现入口图标,你必须要在AndroidManifest中配置action为android.intent.acti ...
- CopyOnWriteArrayList源码解析(1)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:在看这篇文章之前,如果对ArrayList底层不清楚的话,建议先去看看ArrayList源码解析. ht ...
- file-loader引起的html-webpack-plugin坑
引言 最近,我们的一个后台系统要改版为基于react + redux + react-router + ant-design 技术栈,切换到当下比较新的技术来实现后台系统:在项目实施过程中,选择了基于 ...
- Android RelativeLayout wrap_content 而且 child view 使用 layout_alignParentBottom 时 RelativeLayout 高度会占满屏幕
Android RelativeLayout wrap_content 而且 child view 使用 layout_alignParentBottom 时 RelativeLayout 高度会占满 ...
- Mongodb-- python中使用pymongo连接mongodb数据库
一.使用 通过pip或者pychrm下载pymongo模块 import json from pymongo import MongoClient from bson import ObjectId ...
- Speech Synthesis
<Window x:Class="Synthesizer.MainWindow" xmlns="http://schemas.microsoft.com/winfx ...