ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Floyd算法

2020-05-03 11:59:05  阅读:216  来源: 互联网

标签:int graph 算法 Floyd INF 节点 size


Floyd算法

弗洛伊德算法,用来计算多源最短路径(任意两个点之间的最短路径)

符号描述

  • D(i,j)
    • 节点i到节点j的最短距离
  • N(i,j)
    • 节点i到节点j的下一跳节点

思维

  1. 如果某个节点位于起点到终点的最短路径上
    • D(i,j)=D(i,k)+D(k,j)
  2. 如果某个节点不位于起点到终点的最短路径上
    • D(i,j)<D(i,k)+D(k,j)

Java

public class Floyd {
    private int [][]graph;
    private int size;
    private int[][] d;
    private int[][] n;

    public Floyd(int[][] graph) {
        this.graph = graph;
        size=graph.length;
        d=new int[size][size];
        n=new int[size][size];
        for (int i=0;i<size;i++)
            for (int j=0;j<size;j++){
                //拷贝graph
                d[i][j]=graph[i][j];
                    n[i][j]=j;
            }
        cal();
    }
    private void cal() {
        //经过点
        for (int through = 0; through < size; through++){
            //d的遍历
            for (int start = 0; start < size; start++) {
                //通过点和起点重合
                if (start == through)
                    continue;
                for (int end = 0; end < size; end++) {
                    //起点和终点重合或通过点和终点重合
                    if ( start == end || end == through)
                        continue;
                    int distance = d[start][through] + d[through][end];
                    if (distance < d[start][end]) {
                        d[start][end] = distance;
                        n[start][end] = through;
                    }
                }
            }
        }
    }
    public void display(int start,int end){
        String result=""+start;
        while (n[start][end]!=end){
            result+="->"+n[start][end];
            start=n[start][end];
        }
        result+="->"+end;
        System.out.println(result);
    }

    public static void main(String[] args) {
        int INF=Integer.MAX_VALUE/2;
        int[][] graph=new int[][]{
                {INF,-1,3,INF,INF},
                {INF,INF,3,2,2},
                {INF,INF,INF,INF,INF},
                {INF,1,5,INF,INF},
                {INF,INF,INF,INF,-3}
        };
        Floyd floyd=new Floyd(graph);
        floyd.display(0,4);
    }
}

标签:int,graph,算法,Floyd,INF,节点,size
来源: https://www.cnblogs.com/redo19990701/p/12821308.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有