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 ...
随机推荐
- Linux系列
Linux入门及进阶学习. 目录 Linux的安装 GNOME图形界面的基本操作 命令行BASH的基本操作 Linux文件系统的基本结构 Linux文件基本操作管理 Linux系统目录架构 Linux ...
- springboot2.0拦截器和webconfigure配置
接下来介绍一下springboot如何配置拦截器,很简单,只需要两个配置文件就可以了 首先配置登陆拦截器 @Component public class LoginInterceptor implem ...
- Windows下建立ArcGIS Server集群
原创文章,转载须标明出处自: http://www.cnblogs.com/gisspace/p/8269525.html -------------------------------------- ...
- Win10系统下装Ubuntu虚拟机的遇到的问题总结
环境和工具 win10操作系统 VMware Workstation 12 Ubuntu 14.0 64位 教程可参考:VMware Ubuntu安装详细过程(非常靠谱) [因为我的安装过程不是十分顺 ...
- MPP-编码示例
了解MPP的基本功能后,接下来具体分析编码的代码.首先把编码的代码提取出来,方便以后的使用. 完整的编码代码如下,相比较给出的示例代码,做了一些改动,输入的指令全部去除,将函数入口改为利用OpenCV ...
- python datetime操作
#datetime object转化为timestamp import datetime now = datetime.datetime.now() now_timestamp = time.mkti ...
- java 根据ip获取地区信息(淘宝和新浪)
package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...
- Scrapy框架-Spider和CrawlSpider的区别
目录 1.目标 2.方法1:通过Spider爬取 3. 通过CrawlSpider爬取 1.目标 http://wz.sun0769.com/index.php/question/questionTy ...
- 【Python实战】模块和包导入详解(import)
1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...
- .NET、PHP、MySql、JS中的时间戳你每次是手写还是复制?这篇文章让你一次性搞懂
什么是时间戳(chuō)? 答:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. 为什么时间戳要从1970年01月0 ...