弗洛伊德算法(转)

https://blog.csdn.net/qq_34374664/article/details/52261672

https://blog.csdn.net/qq_35644234/article/details/60875818

这两篇结合起来看,便于理解

人物简介以及瞎bb

弗洛伊德,我还特意去百度了一下,结果搜出好多弗洛伊德。最后还是找到了我们这次的主角。

罗伯特·弗洛伊德,计算机科学家,图灵奖得主,前后断言法的创始人堆排序算法和Floyd-Warshall算法的创始人之一。这一段当然是摘自百度了。

可以说他是自学成才的,因为人家本来是搞文学的,就是因为对计算机的兴趣以及自己不懈的努力,终于称为计算机领域一位举足轻重的人物,这一点值得吾辈学习。

计算机是一门崇高的学科,它是一门伟大的科学,而我们就是这个领域的战士,所以,不要觉得这个东西很无聊,我们是在改变世界啊!不仅是为了工资,也让我们为了科学而不断的奋斗吧,人总要有一些崇高的理由,让生活有仪式感。

现在进入正题。

正题

它跟迪杰斯特拉算法不同的地方在于,它可以求出任意两点的最短距离。

说穿了,也就是遍历。首先你要拿出一个中介点,然后计算其余任意两点通过这个中介点的最短距离。

每个点都会被当作中介点。

首先,你要列出两个矩阵,从上面第二篇文章中的图来看。

首先,初始化两个矩阵,然后你看,如果两点的距离大于它们各自到这个中介点的距离之和,那么就把它替换为到中介点的距离之和。

同样修改P矩阵,把它们的中介点修改为当前中介点,初始中介点为边的终点。

通过一次次的遍历,总会得到两点的最短距离,这是我的初步理解

 1 package com.java.demo.算法.图.弗洛伊德算法;
 2 
 3 public class Test {
 4     private final static int INF = 100;
 5     private char points[];
 6     private int dsides[][];
 7     private int psides[][];
 8     private int num;   //点的数量
 9     public static void main(String[] args) {
10         char points[] = {'A','B','C','D'};
11         int sides[][] = {
12                 //A,B,C,D
13           /*A*/      {0,3,INF,5},
14           /*B*/      {3,0,7,INF},
15           /*C*/      {INF,7,0,11},
16           /*D*/      {5,INF,11,0},
17         };
18         Test t = new Test(points, sides);
19         t.floyd();
20     }
21 
22     //弗洛伊德算法
23     public void floyd(){
24         int middle;
25         int p1;
26         int p2;
27         //遍历每个结点,把它作为中介点
28         for (middle=0;middle<num;middle++){
29             for (p1=0;p1<num;p1++){
30                 for (p2=0;p2<num;p2++){
31                     //如果两点是同一点,则跳过
32                     if (p1 == p2)
33                         continue;
34                     //判断两点距离是否大于各自到中介点的距离之和,如果是,则替换
35                     if (dsides[p1][p2] > dsides[p1][middle]+dsides[p2][middle]){
36                         dsides[p1][p2] = dsides[p1][middle]+dsides[p2][middle];
37                         psides[p1][p2] = middle;
38                     }
39                 }
40             }
41         }
42 
43 
44         for (int i=0;i<num;i++){
45             for (int j=0;j<num;j++){
46                 if (i == j)
47                     continue;
48                 System.out.printf("%s->%s:",points[i],points[j]);
49                 getPath(i,j);
50                 System.out.println();
51             }
52 
53         }
54     }
55 
56     public void getPath(int i,int j){
57         if (i == j)
58             return;
59         int z;
60         if ((z=psides[i][j]) != j){
61             getPath(i,z);
62             getPath(z,j);
63         }else {
64             System.out.printf("%s->%s ",points[i],points[j]);
65         }
66 
67     }
68 
69     public int getPosition(char ch){
70         for (int i=0;i<num;i++){
71             if (points[i] == ch){
72                 return i;
73             }
74         }
75         return -1;
76     }
77 
78     public Test(char[] points, int[][] sides) {
79         this.points = points;
80         this.dsides = sides;
81         this.num = points.length;
82         this.psides = new int[num][num];
83         for (int i=0;i<num;i++){
84             for (int j=0;j<num;j++){
85                 psides[i][j] = j;
86             }
87         }
88     }
89 }
View Code
原文地址:https://www.cnblogs.com/lwhblog/p/10783148.html