Floyd算法(弗洛伊德算法) 百度百科
核心代码
for(int k=1; k<=NODE; ++k)//对于每一个中转点
for(int i=0; i<=NODE; ++i)//枚举源点
for(int j=0; j<=NODE; ++j)//枚举终点
if(distmap[i][j]>distmap[i][k]+distmap[k][j])//不满足三角不等式
{
distmap[i][j]=distmap[i][k]+distmap[k][j];//更新
path[i][j]=k;//记录路径
}
状态转移方程
时间复杂度与空间复杂度
优缺点分析
算法描述
参考代码
C语言
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include<stdio.h> #include<stdlib.h> #define max 1000000000 int d[1000][1000],path[1000][1000]; int main() { int i,j,k,m,n; int x,y,z; scanf ( "%d%d" ,&n,&m); for (i=1;i<=n;i++) for (j=1;j<=n;j++){ d[i][j]=max; path[i][j]=j; } for (i=1;i<=m;i++) { scanf ( "%d%d%d" ,&x,&y,&z); d[x][y]=z; d[y][x]=z; } for (k=1;k<=n;k++) for (i=1;i<=n;i++) for (j=1;j<=n;j++) { if (d[i][k]+d[k][j]<d[i][j]){ d[i][j]=d[i][k]+d[k][j]; path[i][j]=path[i][k]; } } for (i=1;i<=n;i++) for (j=1;j<=i;j++) if (i!=j) printf ( "%d->%d:%d\n" ,i,j,d[i][j]); int f,en; scanf ( "%d%d" ,&f,&en); while (f!=en){ printf ( "%d->" ,f); f=path[f][en]; } printf ( "%d\n" ,en); return 0; } |
C++语言
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#include<iostream> #include<vector> using namespace std; const int &INF=100000000; void floyd(vector<vector< int > > &distmap, //可被更新的邻接矩阵,更新后不能确定原有边 vector<vector< int > > &path) //路径上到达该点的中转点 //福利:这个函数没有用除INF外的任何全局量,可以直接复制! { const int &NODE=distmap.size(); //用邻接矩阵的大小传递顶点个数,减少参数传递 path.assign(NODE,vector< int >(NODE,-1)); //初始化路径数组 for ( int k=1; k!=NODE; ++k) //对于每一个中转点 for ( int i=0; i!=NODE; ++i) //枚举源点 for ( int j=0; j!=NODE; ++j) //枚举终点 if (distmap[i][j]>distmap[i][k]+distmap[k][j]) //不满足三角不等式 { distmap[i][j]=distmap[i][k]+distmap[k][j]; //更新 path[i][j]=k; //记录路径 } } void print( const int &beg, const int &end, const vector<vector< int > > &path) //传引用,避免拷贝,不占用内存空间 //也可以用栈结构先进后出的特性来代替函数递归 { if (path[beg][end]>=0) { print(beg,path[beg][end],path); print(path[beg][end],end,path); } else cout<< "->" <<end; } int main() { int n_num,e_num,beg,end; //含义见下 cout<< "(不处理负权回路)输入点数、边数:" ; cin>>n_num>>e_num; vector<vector< int > > path, distmap(n_num,vector< int >(n_num,INF)); //默认初始化邻接矩阵 for ( int i=0,p,q; i!=e_num; ++i) { cout<< "输入第" <<i+1<< "条边的起点、终点、长度(100000000代表无穷大,不联通):" ; cin>>p>>q; cin>>distmap[p][q]; } floyd(distmap,path); cout<< "计算完毕,可以开始查询,请输入出发点和终点:" ; cin>>beg>>end; cout<< "最短距离为" <<distmap[beg][end]<< ",打印路径:" <<beg; print(beg,end,path); } |
Floyd算法(弗洛伊德算法) 百度百科的更多相关文章
- Floyd算法(弗洛伊德算法)
算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...
- 经典问题----最短路径(Floyd弗洛伊德算法)(HDU2066)
问题简介: 给定T条路,S个起点,D个终点,求最短的起点到终点的距离. 思路简介: 弗洛伊德算法即先以a作为中转点,再以a.b作为中转点,直到所有的点都做过中转点,求得所有点到其他点的最短路径,Flo ...
- 弗洛伊德算法(Floyd算法)
原博来自http://www.cnblogs.com/skywang12345/ 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的 ...
- <算法笔记>关于快速排序的算法优化排序(顺便给百度百科纠个错)
快速排序是排序算法之中的基本中的基本,虽然越来越多的接口函数将快速排序“完美的封装了起来”,比如C++中的qsort或者<algorithm>中的sort(与stable_sort相对应) ...
- 弗洛伊德算法(Floyd )
package com.rao.graph; /** * @author Srao * @className Floyd * @date 2019/12/11 18:43 * @package com ...
- Floyd(弗洛伊德)算法(C语言)
转载:https://blog.csdn.net/qq_35644234/article/details/60875818 Floyd算法的介绍 算法的特点 弗洛伊德算法是解决任意两点间的最短路径的一 ...
- 数据结构与算法——弗洛伊德(Floyd)算法
介绍 和 Dijkstra 算法一样,弗洛伊德(Floyd)算法 也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978 年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特 ...
- 【图论】Floyd消圈算法
毫无卵用的百度百科 Definition&Solution 对于一个给定的链表,如何判定它是否存在环以及环的长度问题,可以使用Floyd消圈算法求出. 从某种意义上来讲,带环的链表在本质上是一 ...
- Floyd最短路算法
Floyd最短路算法 ----转自啊哈磊[坐在马桶上看算法]算法6:只有五行的Floyd最短路算法 暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计 ...
随机推荐
- android TextView 设置字体大小
package com.example.yanlei.yl4; import android.graphics.Color;import android.os.Bundle;import androi ...
- 谈oracle数据比对(DBMS_COMPARISON)
今天是2014-08-19,我今天收到csdn给我发的申请博客专家的邀请,自己感觉实在羞愧啊. 自从换了工作也一直没有精力在写点东西了.今天我一个同事,在群里贴出了一个数据比对的包(DBMS_COMP ...
- navicat小经验和快捷键
1.有时按快捷键Ctrl+F搜某条数据的时候搜不到,但是能用sql查出来,这是怎么回事? Ctrl+F只能搜本页数据,不在本页的数据搜不到,navicat每页只显示1000条数据.在数据多的时候nav ...
- css3 - target
通过CSS3伪元素target,我们可以实现拉风琴 源码 <!DOCTYPE HTML> <html lang="en-US"> <head> ...
- scheme语言编写执行
scheme是lisp的一种 编辑器能够用emacs.网上有非常多教导怎样编写的 (begin (display "hello") (newline)) 编写完以.scm保存,这里 ...
- ggplot2-为图形加入直线
本文更新地址:http://blog.csdn.net/tanzuozhev/article/details/51112057 本文在 http://www.cookbook-r.com/Graphs ...
- js 字符串常用方法
数组方面 1.push:向数组尾部增加内容,返回的是新数组的长度. var arr = [1,2,3]; console.log(arr); var b = arr.push(4); console. ...
- 绝不要在构造函数和析构过程中调用virtual函数
下面是一个用来塑模股市交易的类: derived的类的构造函数被调用,但是首先得调用基类Transaction的构造函数,但是在后面还得调用virrual函数,这个时候子类的对象的构造还没有完成,那么 ...
- Anyoffice -HTML5大赛 悦心(基于H5开发安卓音乐app)-项目总结
项目在线演示地址:http://rose111.applinzi.com/ github 地址:欢迎star https://github.com/midoxinxin/YueX-Music 悦心,一 ...
- Ubuntu16.04 下docker部署web项目
概念性的请戳 第一步:更新apt-get update 第二步:安装环境 apt-get install \ apt-transport-https \ ca-certificates \ curl ...