Floyd-Warshall求图中任意两点的最短路径
原创
除了DFS和BFS求图中最短路径的方法,算法Floyd-Warshall也可以求图中任意两点的最短路径。
从图中任取两点A、B,A到B的最短路径无非只有两种情况:
1:A直接到B这条路径即是最短路径(前提是存在此路径);
2:A先通过其他点,再由其他点到B。
我们并不知道A是否需要通过其他点间接到达B,所以只能比较,用A到B的直接路径和A先通过其他点
再间接到达B的路径长度进行比较,然后更新为较小值。

上图中若要求顶点4到顶点3的最短路径,可以比较顶点4直接到3的路径和顶点4先到1,再到3的路径。
更新为最小值,此时邻接矩阵matrix[4][3]存储的即为借用了顶点1后4到3的最短路径;然后再借用了1的
基础上再借用顶点2,此时再次比较matrix[4][3]和matrix[4][2]+matrix[2][3],更新为最小值;比较完
毕后matrix[4][3]乃存储了最短路径,求其他任意两点也是如此。
总结一下,求图中任意两点的最短路径,通过比较一次取一个其他顶点间接到达的最短路径和直接路径
进行比较,更新为最小值即可。
import java.util.*;
public class Floyd_Warshall {
static int v; //顶点
static int e; //边
static int matrix[][];
public static void main(String args[]) {
Scanner reader=new Scanner(System.in);
v=reader.nextInt();
e=reader.nextInt();
matrix=new int[v+1][v+1]; //编号从1开始
//矩阵初始化
for(int i=1;i<=v;i++) {
for(int j=1;j<=v;j++) {
if(i==j) { //顶点本身
matrix[i][j]=0;
}
else { //无穷
matrix[i][j]=99999;
}
}
}
//读入边
for(int i=1;i<=e;i++) {
int first_City=reader.nextInt();
int second_City=reader.nextInt();
int value=reader.nextInt();
matrix[first_City][second_City]=value; //有向图
}
for(int k=1;k<=v;k++) { //只允许经过顶点k
for(int i=1;i<=v;i++) {
for(int j=1;j<=v;j++) {
if(matrix[i][k]+matrix[k][j]<matrix[i][j]) {
matrix[i][j]=matrix[i][k]+matrix[k][j];
}
}
}
}
for(int i=1;i<=v;i++) {
for(int j=1;j<=v;j++) {
System.out.print(matrix[i][j]+" ");
}
System.out.println();
}
}
}
测试用例:
输入:
4 8
1 2 2
2 3 3
3 4 1
4 3 12
1 3 6
3 1 7
1 4 4
4 1 5
输出:
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0
12:30:24
2018-07-28
Floyd-Warshall求图中任意两点的最短路径的更多相关文章
- Geotools求shapefile路网中任意两点之间最短路径的距离
前言:之前在博问求助过这个问题.经过几天的思考,算是解决了(但仍有不足),另一方面对Geotools不是很熟,有些描述可能不正确,希望大家批评指正. 问题:作为一个新手,我并没有发现Geotools中 ...
- javascript实现有向无环图中任意两点最短路径的dijistra算法
有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://w ...
- poj2762 判断一个图中任意两点是否存在可达路径 也可看成DAG的最小覆盖点是否为1
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 179 ...
- [Python] 弗洛伊德(Floyd)算法求图的直径并记录路径
相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两 ...
- Floyd算法——计算图中任意两点之间的最短路径
百度百科定义:传送门 一.floyd算法 说实话这个算法是用来求多源最短路径的算法. 算法原理: 1,从任意一条单边路径开始.所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大. 2,对 ...
- JavaScript 查找图中连接两点的所有路径算法
1.把图看成以起点为根节点的树 2.使用深度遍历算法遍历路径 3.遍历到节点为目标节点时,保存这条路径 find2PointsPath(sourceId, targetId) { const { no ...
- hdu 5952 Counting Cliques 求图中指定大小的团的个数 暴搜
题目链接 题意 给定一个\(n个点,m条边\)的无向图,找出其中大小为\(s\)的完全图个数\((n\leq 100,m\leq 1000,s\leq 10)\). 思路 暴搜. 搜索的时候判断要加进 ...
- hdu4587 Two Nodes 求图中删除两个结点剩余的连通分量的数量
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 题目给了12000ms,对于tarjan这种O(|V|+|E|)复杂度的算法来说,暴力是能狗住的 ...
- poj The Settlers of Catan( 求图中的最长路 小数据量 暴力dfs搜索(递归回溯))
The Settlers of Catan Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1123 Accepted: ...
随机推荐
- PAT1018——最短路加DFS
http://pat.zju.edu.cn/contests/pat-a-practise/1018 在杭州各个点,有很多自助自行车的点,最大容纳点为CMAX,但比较适合的情况是CMAX/2, 现在从 ...
- 如何设计并使用FireMonkeyStyle
如何设计并使用FireMonkeyStyle FireMonkey使用Style来控制控件的显示方式. 每个控件都有一个StyleLookup属性,FireMonkey就是通过控件的这个属性来在当前窗 ...
- ffmpeg摄像头采集h264编码RTP发送
一. 相关API说明 1. av_register_all 2. avformat_network_init 不管是流媒体发送还是流媒体接收, 需要先执行该函数. 3. avformat_alloc_ ...
- 【转】jmeter实践
目录(?)[-] Jmeter相关概念简介 应用实例 AbApacheBench对比 本文主要介绍性能测试中的常用工具jmeter的使用方式,以方便开发人员在自测过程中就能自己动手对系统进行自动压测和 ...
- 记录一下学习Android的小知识
目前要设计即时通讯的整体架构,包括服务端.Android.IOS.PC.平板等等系统,所以需要研究一下手机的实现方式,开始从Android入手,偶尔在这记录下小知识. ADT: 1.页面功能请求结构, ...
- C#字符串Split方法的误区
string s = "aaa1bbb2ccc1ddd"; string[] ss = s.Split("12".ToCharArray()); ...
- Py修行路 python基础 (二十四)socket编程
socket编程 一.客户端/服务端架构 客户端/服务端架构 即C/S架构,包括:1.硬件C/S架构,2.软件C/S架构. 互联网中处处都是C/S架构,学习socket 就是为了完成C/S架构的开发. ...
- springboot成神之——log4j2的使用
本文介绍如何在spring-boot中使用log4j2 说明 依赖 日志记录语句 log4j2配置文件 本文介绍如何在spring-boot中使用log4j2 说明 log4j2本身使用是非常简单的, ...
- sql代码段添加数据
declare @i int,@index int set @i=1 set @index=0 while @i<1000000 begin set @inde ...
- C#操作SQLIte数据。
using System; using System.Data; using System.Text.RegularExpressions; using System.Xml; using Syste ...