单元最短路
在一个有 n 个点, m 个边的有向图中,已知每条边长,求出 1 到 n 的最短路径,返回 1 到 n 的最短路径值。如果 1 无法到 n ,输出 -1
图中可能有重边,无自环。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int 顶点数
* @param m int 边数
* @param graph int二维数组 一维3个数据,表示顶点到另外一个顶点的边长度是多少
* @return int 返回 1 到 n 的最短路径值。如果 1 无法到 n ,输出 -1
*/
public int findShortestPath (int n, int m, int[][] graph) {
int[][] matrix = new int[n + 1][n + 1]; //邻接矩阵
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
matrix[i][j] = i == j ? 0 : -1;//-1 为两点之间没有直接的路
}
}
for(int i = 0; i < graph.length; ++i) {
if(matrix[graph[i][0]][graph[i][1]] == -1)
matrix[graph[i][0]][graph[i][1]] = graph[i][2];
else
matrix[graph[i][0]][graph[i][1]] = Math.min(matrix[graph[i][0]][graph[i][1]], graph[i][2]);//注意重边
}
int[] paths = new int[n + 1]; //表示1到各节点的路径 -1为无限远
Arrays.fill(paths, -1);
int []selected = new int[n + 1]; //已经考察过的节点
paths[1] = 0;
int minNode = getNext(paths, selected, n); //获取下一个路径最小,未考察过的节点
while(minNode != -1) { //未考察完全部点
for(int i = 1; i <= n; ++i) {
if(matrix[minNode][i] == -1) //距离无限远, 下一个
continue;
if(paths[i] == -1)
paths[i] = matrix[minNode][i] + paths[minNode]; //首次到达目的地, 写入
else
paths[i] = Math.min(matrix[minNode][i] + paths[minNode], paths[i]);//再次到达目的地, 写入更短的距离
}
selected[minNode] = 1;
minNode = getNext(paths, selected, n);
}
return paths[n];
}
public int getNext(int[] paths, int[] selected, int n) {
int minNode = -1;
int min = 9999;
for(int i = 1; i <= n; ++i) {
if(paths[i] == -1)
continue;
if(selected[i] == 0 && paths[i] < min) {
min = paths[i];
minNode = i;
}
}
return minNode;
}
}
本文来自博客园,作者:brbrbr,转载请注明原文链接:https://www.cnblogs.com/brbrbr/p/15881476.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)