Dijkstra算法模板

199 阅读1分钟

参考:blog.csdn.net/weixin_4141…

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();
    }
}