一.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(转)的更多相关文章

  1. 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较

        几大最短路径算法比较 转自:http://blog.csdn.net/v_july_v/article/details/6181485 几个最短路径算法的比较: Floyd        求多 ...

  2. 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较(转)

    几大最短路径算法比较 几个最短路径算法的比较:Floyd        求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3).       Floy ...

  3. 多源最短路径算法—Floyd算法

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...

  4. 图的最短路径算法-- Floyd算法

    Floyd算法求的是图的任意两点之间的最短距离 下面是Floyd算法的代码实现模板: ; ; // maxv为最大顶点数 int n, m; // n 为顶点数,m为边数 int dis[maxv][ ...

  5. 最短路径算法——Dijkstra算法与Floyd算法

    转自:https://www.cnblogs.com/smile233/p/8303673.html 最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2  ...

  6. 几大最短路径算法比较(Floyd & Dijkstra & Bellman-Ford & SPFA)

    几个最短路径算法的比较:Floyd 求多源.无负权边(此处错误?应该可以有负权边)的最短路.用矩阵记录图.时效性较差,时间复杂度O(V^3).       Floyd-Warshall算法(Floyd ...

  7. 最短路径---Dijkstra/Floyd算法

    1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...

  8. Floyd最短路径算法

    看完这篇文章写的小程序,Floyd最短路径算法,求从一个点到另一个点的最短距离,中间可以经过其他任意个点.三个for循环,从i到j依次经过k的最短距离,最外层for循环是经过点K,内部两个循环是从i( ...

  9. 经典问题----最短路径(Floyd弗洛伊德算法)(HDU2066)

    问题简介: 给定T条路,S个起点,D个终点,求最短的起点到终点的距离. 思路简介: 弗洛伊德算法即先以a作为中转点,再以a.b作为中转点,直到所有的点都做过中转点,求得所有点到其他点的最短路径,Flo ...

随机推荐

  1. 18、标准IO库详解及实例

    标准IO库是由Dennis Ritchie于1975年左右编写的,它是Mike Lestbain写的可移植IO库的主要修改版本,2010年以后, 标准IO库几乎没有进行什么修改.标准IO库处理了很多细 ...

  2. bootstrap4.2 导航搜索框

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. 第二天:Javascript事件

    事件:是可以被Javascript侦测到的行为,例如鼠标的点击,鼠标的移动,常见的事件如下   代码实现“点击事件”: <body> <button onclick="de ...

  4. DotNetCore依赖注入实现批量注入

    文章转载自平娃子(QQ:273206491):http://os.pingwazi.cn/resource/batchinjectservice 一.依赖注入 通过依赖注入,可以实现接口与实现类的松耦 ...

  5. FFmpeg简易播放器的实现-视频播放

    本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10047035.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  6. Mongodb--基础(连接,增删改查,数据类型)

    mongodb 日常启动命令 mongod --dbpath D:\data\db 一.启动,连接 mongodb是一个非关系型数据库 1. 启动MongoDB服务: 安装时我并没有将mongodb服 ...

  7. 带你走进二进制-一次APT攻击分析

    原文:https://osandamalith.com/2017/06/04/apt-attack-in-bangladesh/ 由prison翻译整理,首发i春秋   引言;   这是一次来自遥远国 ...

  8. InfluxDB配置文件详解

    全局配置 # 该选项用于上报influxdb的使用信息给InfluxData公司,默认值为false reporting-disabled = false # 备份恢复时使用,默认值为8088 bin ...

  9. postgresql-tps

    tps TPS就是每秒事务数,但是事务是基于虚拟用户数的,假如1个虚拟用户在1秒内完成1笔事务,那么TPS明显就是1:如果 某笔业务响应时间是1ms,那么1个用户在1秒内能完成1000笔事务,TPS就 ...

  10. [Spring]@Autowired,@Required,@Qualifier注解

    @Required注解 @Required注解用于setter方法,表明这个属性是必要的,不可少的,必须注入值 假设有个测试类,里面有name和password两个属性 我给两个属性的setter方法 ...