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 国际」许可协议进行许可。
各位可以多多推广哦φ(>ω<*)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)