Freud's algorithm of data structure and algorithm (36)

Daily demo of learning data structures and algorithms

Introduction to Freud Algorithm

Insert picture description here

Freud algorithm analysis

Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here

  1. Taking the vertex A as the middle vertex, the distance from B-> A-> C is from N-> 9, and the same is true from C to B; the distance from C-> A-> G is from N-> 12, and the distance from G-C
  2. Replace the intermediate vertices and perform operations in a loop until all vertices are updated as intermediate vertices and the calculation ends

Code

public class FloydAlgorithm {
    private static final int N = 65535;

    public static void main(String args[]) {
        char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
        //创建邻接矩阵
        int[][] matrix = new int[vertex.length][vertex.length];
        matrix[0] = new int[]{0, 5, 7, N, N, N, 2};
        matrix[1] = new int[]{5, 0, N, 9, N, N, 3};
        matrix[2] = new int[]{7, N, 0, N, 8, N, N};
        matrix[3] = new int[]{N, 9, N, 0, N, 4, N};
        matrix[4] = new int[]{N, N, 8, N, 0, 5, 4};
        matrix[5] = new int[]{N, N, N, 4, 5, 0, 6};
        matrix[6] = new int[]{2, 3, N, N, 4, 6, 0};

        //创建 Graph 对象
        Graph graph = new Graph(matrix, vertex);
        //调用弗洛伊德算法
        graph.floyd();
        graph.print();
    }
}

class Graph {
    char[] vertexs; // 存放顶点
    int[][] dis;    // 保存从各个顶点出发到其他顶点的距离
    int[][] pre;    // 保存到达目标顶点的前驱顶点

    public Graph(int[][] matrix, char[] vertexs) {
        this.dis = matrix;
        this.vertexs = vertexs;
        this.pre = new int[vertexs.length][vertexs.length];
        // 初始化pre,存放前驱顶点下标
        for (int i = 0; i < vertexs.length; i++) {
//            for (int j = 0; j < vertexs.length; j++) {
//                pre[i][j] = i;
//            }
            Arrays.fill(pre[i], i);
        }
    }

    public void print() {
        for (int[] di : dis) {
            for (int i : di) {
                System.out.printf("%12d", i);
            }
            System.out.println();
        }
        System.out.println("从i到j的中间顶点:");
        for (int[] ints : pre) {
            for (int i : ints) {
                System.out.printf("%12c", this.vertexs[i]);
            }
            System.out.println();
        }

        System.out.println("即:");
        for (int i = 0; i < pre.length; i++) {
            for (int j = 0; j < pre.length; j++) {
                System.out.print(vertexs[i] + "-->" + vertexs[pre[i][j]] + "-->" + vertexs[j]+"    ");
            }
            System.out.println();
        }
    }

    // 弗洛伊德算法
    public void floyd() {
        // 保存距离(权值)
        int len = 0;
        // 从中间顶点k遍历[A,B,C,D,E,F.G]
        for (int k = 0; k < dis.length; k++) {
            // 从i顶点开始出发[A,B,C,D,E,F.G]
            for (int i = 0; i < dis.length; i++) {
                // j是到达的终点[A,B,C,D,E,F.G]
                for (int j = 0; j < dis.length; j++) {
                    // 从i顶点出发经过k中间顶点到达j顶点的距离
                    len = dis[i][k] + dis[k][j];
                    // 如果i,k,j连通距离小于i,j直连的距离
                    if (len < dis[i][j]) {
                        // 将小的更新给dis矩阵(两点距离)
                        dis[i][j] = len;
                        // 更新终点的前驱点
                        pre[i][j] = pre[k][j];
                    }
                }
            }
        }
    }
}

Insert picture description here

GitHub: data structure and algorithm source code

Published 83 original articles · Like 23 · Visit 3528

Guess you like

Origin blog.csdn.net/qq_44779506/article/details/105412661