最短路径算法----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 ...
随机推荐
- h5canvas绘制loading页面
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- java基础知识-新手上路注意事项一
1.文件名,类名,字节码文件名三者的关系 源文件名:Demo.java 类名:Demo 字节码文件名:Demo.class 2.如果class定义前,加上public修饰,说明这是一个公共类,此时类名 ...
- 转:log4j的使用简介
spring使用log4j,可以有2种方法. 1.在web.xml里不做任何配置. log4j.properties放在classpath根目录下, 这时候生成的日志文件就没有相对路径,如果写相对路径 ...
- SET FOREIGN_KEY_CHECKS=0;在Mysql中取消外键约束
Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构. 解决方法是在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导 ...
- Java设计模式详尽资料
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 1.html基础
认识html 1.1 Hyper text markup language 超文本标记语言. 超文本:超链接.(实现页面跳转) Html结构标准 < ! doctype html> ...
- Windows下Node.js的安装与配置
一.下载和安装 1. 前往官网https://nodejs.org/或https://nodejs.org/en/download/下载最新推荐版的Node.js,本文使用10.13.0版本. 对于W ...
- WinDbg探究CLR底层(1) - 应用程序域
一.什么是应用程序域 操作系统由于其稳定性与可靠性的要求,都会使用隔离层,来确保运行在某个隔离层内的代码不会对其他隔扇层的代码产生影响.如Windows通过进程来实现这种隔离机制,所能的可执行代码.数 ...
- Android开发教程 - 使用Data Binding(八)使用自定义Interface
本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...
- mysql添加外键的4种方式
今天开始复习,在过后的几天里开始在博客上记录一下平时疏忽的知识点,温故而知新 屁话不多--直接上货 创建主表: 班级 CREATE TABLE class(cid INT PRIMARY KEY AU ...