Floyed-Warshall【弗洛伊德算法】
首先介绍一下有关最短路径的知识
从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径。解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyed算法和SPFA算法等。
——百度百科
通俗点来说就是在图中的两点之间的最短距离(只不过这里规定了路径而已)
那么,我们的问题来了
什么是图?
图(Graph【这也是为什么oier们通常设g数组的原因】)是表示物件与物件之间的关系的数学对象,是图论的基本研究对象。
简洁来说,就是一个神奇的表示关系的图表(别告诉我你们不知道图表是什么)
什么是权值?
在数学领域,权值指加权平均数中的每个数的频数,也称为权数或权重。
也就是这条边的价值【类似于长度】
那么这里对于一些基本的概念性的知识应该是没有什么问题了
说实话这个算法是用来求多源最短路径的算法。
——gh
——题记【并Orz一波】
这里的算法原理可以看做是一个相对来说和DP有些关系的DP
这个神奇的算法的复杂度井然是O(n3)【令人十分慌张】
但这个算法也有其一定的优点:
1.可以计算图中任意两点间的最短路径
2.适用于负边权的情况
…………【好处很多,我们要有一双善于发现好处的眼睛】
核心代码类似于这个
for(k=;k<=n;k++)
{
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
if((i!=j)&&(i!=k)&&(j!=k)&&(f[i][k]+f[k][j]<f[i][j]))//这里是一步松弛操作,使得f[i][j]是最短的
{
f[i][j]=f[i][k]+f[k][j];
}
}
}
}
其实很好理解
这里放一个最简单的例题给大家刷一刷吧
这里很好理解
就直接放代码了
#include<bits/stdc++.h>
using namespace std;
int a[][];
double f[][];
int n,i,j,k,x,y,m,s,e;
int main()
{
cin>>n;
for(i=;i<=n;i++)
{
cin>>a[i][]>>a[i][];
}
cin>>m;
memset(f,0x7f,sizeof(f));//将这个矩阵初始化一下
for(i=;i<=m;i++)
{
cin>>x>>y;
f[y][x]=f[x][y]=sqrt(pow(double(a[x][]-a[y][]),)+pow(double(a[x][]-a[y][]),));//这就是两点间距离公式了【注意需要强制类型转换】,因为是无向的,所以f[x][y]=f[y][x]
}
cin>>s>>e;
for(k=;k<=n;k++)
{
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
if((i!=j)&&(i!=k)&&(j!=k)&&(f[i][k]+f[k][j]<f[i][j]))
{
f[i][j]=f[i][k]+f[k][j];
}
}
}
}
printf("%.2lf",f[s][e]);
}
Floyed-Warshall【弗洛伊德算法】的更多相关文章
- 最短路径问题---Floyed(弗洛伊德算法),dijkstra算法,SPFA算法
在NOIP比赛中,如果出图论题最短路径应该是个常考点. 求解最短路径常用的算法有:Floyed算法(O(n^3)的暴力算法,在比赛中大概能过三十分) dijkstra算法 (堆优化之后是O(MlogE ...
- 弗洛伊德算法Floyed(求各顶点间最短路径):可打印最短路径
#include <iostream> #include <string> #include <iomanip> using namespace std; #def ...
- Floyd算法(弗洛伊德算法)
算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 经典问题----最短路径(Floyd弗洛伊德算法)(HDU2066)
问题简介: 给定T条路,S个起点,D个终点,求最短的起点到终点的距离. 思路简介: 弗洛伊德算法即先以a作为中转点,再以a.b作为中转点,直到所有的点都做过中转点,求得所有点到其他点的最短路径,Flo ...
- js图的数据结构处理---弗洛伊德算法
function Graph() { this.graph = [ [0, 2, 4, 0, 0, 0], [0, 0, 1, 4, 2, 0], [0, 0, 0, 0, 3, 0], [0, 0, ...
- 弗洛伊德算法(Floyd算法)
原博来自http://www.cnblogs.com/skywang12345/ 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的 ...
- 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP
文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...
- [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
- 弗洛伊德算法(Floyd )
package com.rao.graph; /** * @author Srao * @className Floyd * @date 2019/12/11 18:43 * @package com ...
随机推荐
- 006. SSO 单点登录(同域SSO/跨域SSO)
SSO 单点登录:一次登录,处处登录. 只需在一个登录认证服务下进行登录后,就可访问所有相互信任的应用 同域 SSO 1. session-cookie机制:服务端通过cookie认证客户端. 用户第 ...
- Dart语言入门(一)
Dart 语言介绍 Dart 是谷歌在 2011 年推出的编程语言,是一种结构化 Web 编程语言,允许用户通过 Chromium 中所整合的虚拟机(Dart VM)直接运行 Dart 语言编写的程序 ...
- canvas动态图标
前言 canvas 强大的功能让它成为了 HTML5 中非常重要的部分,至于它是什么,这里就不需要我多作介绍了.而可视化图表,则是 canvas 强大功能的表现之一. 现在已经有了很多成熟的图表插件都 ...
- C#图片添加文字水印
/// <summary> /// 给图片添加文字水印 /// </summary> /// <param name="img">图片</ ...
- 996.ICU 写给... 写给年轻的自己
好久不"水"长文了,随着Github开源项目996.ICU (工作996,生病ICU) (本意是为了指出互联网等早9晚9每周工作6天的不良加班工作制风气不符合法律,是对程序员等技术 ...
- MySQL SET数据类型
SET: 多选字符串数据类型,适合存储“多个值”. 设定set的时候,同样需要设定“固定的几个值”:存储的时候,可以存储其中的若干个值. 设定set的格式: 字段名称 SET("选项1&q ...
- Arch LInux安装dde(Deepin Desktop Environment 深度桌面环境)
我一直比较推荐一些Linux新手使用Deepin Linux,因为我认为这种尽量的follow Windows的系统至少对于新手来说是比较的友好的,而且预装了QQ 火狐浏览器中文版,甚至还移植了像36 ...
- 解决mySQL数据库锁表问题。
先用这条命令查询数据库阻塞的进程 SELECT * FROM information_schema.innodb_trx 找到后在根据下图这个字段:try_mysql_thread_id 作为这条数据 ...
- jQuery的一些简单基础知识
### 什么是jQuery?jQuery(js+Query)是一款优秀的JavaScript库,帮助开发人员用最少的代码做更多的事情,官网网站http://jquery.com/ ### 为什么学习j ...
- React 精要面试题讲解(一) 单向数据流
react 单向数据流概念 'react框架是怎样的数据流向?'||'react单向数据流是怎样的概念 ?' 解答这个问题之前,我们首先得知道,js框架是个怎样的概念. 框架:具备一定**编程思想** ...