弗洛伊德算法(转)
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 }