题解 | #单源最短路#
单源最短路
https://www.nowcoder.com/practice/9f15b34a2a944a7798a5340ff0dba8b7
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int 顶点数 * @param m int 边数 * @param graph int二维数组 一维3个数据,表示顶点到另外一个顶点的边长度是多少 * @return int */ int lmin = Integer.MAX_VALUE; public int findShortestPath (int n, int m, int[][] graph) { // write code here int[][] lgraph = new int[n][n]; int[] dist = new int[n]; int[] visit = new int[n]; for (int i = 0; i < n; i++) { dist [i] = Integer.MAX_VALUE; } dist [0] = 0; djstra(n, m, graph, dist, visit); return dist[n - 1]; } //不断的用到原点最小距离的点,更新和该点相连的所有点的最小距离(floyd算法中不是),我为人人型动态规划 public void djstra(int n, int m, int graph[][], int[]dist, int[] visit) { int mindex = 0; int min = 0; visit[0] = 1; //i初始为零,i<n+1也可以 for (int i = 1; i < n; i++) { //寻找这一轮中的最小的dist[k] //初始化 for (int k = 0; k < n; k++) { if (visit[k] == 0 && dist[k] < Integer.MAX_VALUE) { min = dist[k]; mindex = k; }//符号打错答案会错误 } //寻找最小的 for (int k = 0; k < n; k++) { if (visit[k] == 0 && dist[k] < min) { min = dist[k]; mindex = k; } } // System.out.println("dist:" + mindex + ":" + dist[mindex]); visit[mindex] = 1; //每一轮用到原点最小距离的点,更新和该点相连的所有点的最小距离 for (int j = 0; j < m; j++) { if (graph[j][0] - 1 == mindex && dist[mindex] + graph[j][2] < dist[graph[j][1] - 1]) { dist[graph[j][1] - 1] = dist[mindex] + graph[j][2]; } } } } }