最短路径算法----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 ...
随机推荐
- java基础-day20
第09天 IO流 今日内容介绍 u File类 u 字符流与字节流 第1章 File类 1.1 File概述 打开API,搜索File类.阅读其描述:File文件和目录路径名的抽象表 ...
- Hdu4687 Boke and Tsukkomi
Boke and Tsukkomi Time ...
- nutch从搜索引擎到网络爬虫
人物介绍 姓名:DougCutting 个人名望:开发出开源全文检索引擎工具包Lucene. 个人简介/主要荣誉:除了 Lucene,还开发了著名的网络爬虫工具 Nutch,分布式系统基础架构Hado ...
- [auto-download-app] 如何使用 javascript 实现 app 自动下载
// 在访客跳转进入的页面中,执行下面使用下面 invoke function (function(){ var str_downloadUrl = "<!--{$apkUrl}--& ...
- unigui导出EXCEL使用NATIVEEXCEL
unigui导出EXCEL使用NATIVEEXCEL // 需要nativeexcel控件// cxg 2017-9-9 unit myExcel; interface uses System.Sys ...
- NTLM移除
- 【BZOJ3709】 [PA2014]Bohater(贪心)
传送门 BZOJ Solution 考虑如果可以回血肯定要打,那么就是按照伤害值从小到大排个序能打就打,不能打就\(NIE\). 接着看不能够回血的,emmm,把这个过程反着看一下就是打一个怪扣\(a ...
- BZOJ 2200--[Usaco2011 Jan]道路和航线(最短路&拓扑排序)
2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1128 Solved: 414[Submit] ...
- Shell - 简明Shell入门06 - 循环语句(Loop)
示例脚本及注释 #!/bin/bash # for循环 for filename in t1 t2 t3 do touch $filename.txt echo "Create new fi ...
- 插入排序(java)
这星期java老师布置的作业就是实现几种常见的排序算法,由于数据结构学了丢得差不多了,今天晚上搞了一晚上才搞出来插入排序的三种算法. 首先说个与题目不搭的话,今天写