7、图两点最短距离

网图中两点之间的最短距离可以通过Dijkstra算法进行计算,通过该算法能够计算出从源点到该图所有顶点的最短距离,给你的问题是: 通过DSjar.jar归档文件提供的使用邻接矩阵存储的图对象,计算图中任意两顶点之间的最短距离和路径。 利用类库中的MGraph的参考代码如下:
           MGraph mg=new MGraph();//创建的图已经实例化了该图的邻接矩阵,你可以通过输出该矩阵进行查看
 输入:标准输入,输入一行有两个正整数,分别表示起点和终点的两个顶点的序号,如果网图有5个顶点,序号从0到4。
 输出:标准输出,输出格式为"A-->E distance 90 path:A-->B-->E",其中,A为源点顶点名,E为终点顶点名,90为A到E的最短距离,A-->B-->E为路径。

 测试用例输入:
 0 4
 测试用例输出:
A-->E distance 90 path:A-->B-->E

import ds.graphic.MGraph;

import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 创建图
        MGraph mg=new MGraph();
        // 输入起点
        int st = sc.nextInt();
        // 输入终点
        int ed = sc.nextInt();

        // Dijkstra 算法求最短距离和路径
        // vi 判断该顶点是否访问
        boolean[] vi= new boolean[mg.vexnum];
        // d 记录起点到该该点的距离
        int[] d = new int[mg.vexnum];
        // 初始化 距离数组d 为最大值
        Arrays.fill(d, Integer.MAX_VALUE);
        // path 记录该顶点的前缀顶点
        int[] path = new int[mg.vexnum];
        // 初始化 前缀顶点数组path 为 -1
        Arrays.fill(path, -1);
        // 将起点的距离改为零
        d[st] = 0;
        for (int i = 0; i < mg.vexnum; i++) {
            // 找到距离起点最近且未访问的点
            int u = -1, mx = Integer.MAX_VALUE;
            for (int j = 0; j < mg.vexnum; j++) {
                if (d[j] < mx && vi[j] == false) {
                    u = j;
                }
            }
            // 如果发现每个顶点都已经被访问了,就退出循环
            if (u == -1) break;
            // 该顶点 u 被访问,则标记
            vi[u] = true;
            // 遍历该顶点 u 可以到达的顶点 v,并更新距离、记录其前缀顶点
            for (int v = 0; v < mg.vexnum; v++) {
                // 只有当从u 到 v 的距离能使得从起点到 v 点距离变短时 才更新距离
                if (mg.edges[u][v] != 0 && d[u] + mg.edges[u][v] < d[v]) {
                    d[v] = d[u] + mg.edges[u][v];
                    path[v] = u;
                }
            }
        }
        // 格式化输出
        System.out.print(mg.vexs[st].vname + "-->" + mg.vexs[ed].vname + " distance " + d[ed] + " path:");
        // 利用栈通过前缀数组的记录找 起点st 到 终点ed 的路径
        Stack<Integer> stack = new Stack<>();
        stack.push(ed);
        while (path[stack.peek()] != -1) {
            stack.push(path[stack.peek()]);
        }
        System.out.print(mg.vexs[stack.pop()].vname);
        while (!stack.empty()) {
            System.out.print("-->" + mg.vexs[stack.pop()].vname);
        }
        System.out.println();
    }
}

作者:aslwr

出处:https://www.cnblogs.com/aslwr/p/17752480.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

各位可以多多推广哦φ(>ω<*)

posted @   qing影  阅读(21)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示