zoukankan      html  css  js  c++  java
  • 弗洛伊德算法(转)

    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
  • 相关阅读:
    pydata-book-利用python进行数据分析-github
    利用Python进行数据分析-github
    stanford提供的数据库
    转:python 实现GUI(图形用户界面)编程
    PyGObject的使用手册
    python-install-package-C++编译器问题---06
    git 命令大全
    redis复习
    Python 十进制转换为二进制 高位补零
    cURL可以做的10件事
  • 原文地址:https://www.cnblogs.com/lwhblog/p/10783148.html
Copyright © 2011-2022 走看看