单元最短路

在一个有 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;
    }
}
posted @   brbrbr  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示