B站王道考研视频,讲非常好:www.bilibili.com/video/BV1b7…
dijkstra 算法可以满足,1、设定出发点start,2、dist[i] 表示从start出发到i点的最短路径,3、path[]表示到从start到点n的最短路径
public class Main {
int INF = Integer.MAX_VALUE >> 1;
private Scanner sc = new Scanner(System.in);
public void run() {
int n = sc.nextInt();
int m = sc.nextInt();
int[][] graph = new int[n][n];
for (int i = 0; i < n; i++) {
Arrays.fill(graph[i], INF);
}
//下标从1开始,转成下标从0开始
for (int i = 0; i < m; i++) {
int x = sc.nextInt() - 1;
int y = sc.nextInt() - 1;
int z = sc.nextInt();
graph[x][y] = Math.min(graph[x][y], z);
}
int[] res = dijkstra(graph, 3);
int ans = res[n - 1] == INF ? -1 : res[n - 1];
System.out.println("ans:" + ans);
//System.out.println(res[2]);
}
// dijkstra算法模板
public int[] dijkstra(int[][] graph, int s) {
int n = graph.length;
int[] dist = new int[n];
boolean[] visit = new boolean[n];
Arrays.fill(dist, INF);
int[] path = new int[n];
for (int i = 0; i < n; i++) {
if (graph[s][i] < INF) {
path[i] = s;
} else {
path[i] = -1;
}
}
//一开始引用的顶点要初始化
dist[s] = 0;
path[s] = -1;
for (int i = 0; i < n; i++) {
int t = -1;
//挑选最小而且没用过的顶点
for (int j = 0; j < n; j++) {
if (!visit[j] && (t == -1 || dist[t] > dist[j])) {
t = j;
}
}
// 被访问过的点不能再被访问
visit[t] = true;
//遍历该顶点各边,小于就更新
for (int j = 0; j < n; j++) {
if (dist[j] > dist[t] + graph[t][j]) {
dist[j] = dist[t] + graph[t][j];
path[j] = t;
}
}
}
// 打印路径
System.out.println("path:");
for (int i = 0; i < path.length; i++) {
System.out.println(path[i]);
}
return dist;
}
public static void main(String[] args) {
new Main().run();
}
}