原创


  除了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

最新文章

  1. lower函数
  2. etl学习系列1——etl工具安装
  3. 简单用DOM4J结合XPATH解析XML
  4. 【Hibernate 5】继承映射配置及多态查询
  5. DB2学习
  6. adb链接手机调试android应用
  7. windows 8 metro 开发学习资源链接
  8. Python:2D画图库matplotlib学习总结
  9. SQL SERVER 2012 AlwaysOn– 数据库层面 02
  10. Asp.Net MVC @Html.TextBox 只允许输入数字问题
  11. zabbix批量监控域名下nginx的访问50x状态码数量
  12. Java发送邮件 —— SpringBoot集成Java Mail
  13. java初级笔记
  14. flask 中orm关系映射 sqlalchemy的查询
  15. P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers
  16. Mac虚拟机上使用Genumotion模拟器
  17. android适配不同分辨率的手机
  18. 电商打折套路分析 —— Python数据分析练习
  19. 自动化之UI(autoit)
  20. 为Azure Web Site 添加ADFS验证支持之二 在代码里使用ADFS

热门文章

  1. Cocoa Pod使用总结
  2. 关于ListView和GridView的应用
  3. WinForm Flicker闪屏解决方案
  4. 南阳OJ 1170 最大的数
  5. java中利用if_else if循环求税率
  6. AngularJS:template
  7. 从零开始搭建包含多个子系统的Vue工程项目
  8. C#中Monitor对象与Lock关键字的区别分析
  9. python ftp 上传
  10. DDD学习笔录——提炼问题域之与领域专家一起获得领域见解