题解 | #【模板】单源最短路2#

【模板】单源最短路2

http://www.nowcoder.com/practice/7c1740c3d4ba4b3486df4847ee6e8fc7

import java.util.*;
public class Main {
    public static final int N = 50000 * 10000 + 1;
    static int[][] edges = new int[5001][5001];
    static int[] length = new int[5001];
    static boolean[] visited = new boolean[5001];

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int m = input.nextInt();

        int start;
        int end;
        int weight;
        for (int[] ints : edges) {
            Arrays.fill(ints, N);
        }

        for (int i = 0; i < m; i++) {
            start = input.nextInt();
            end = input.nextInt();
            weight = input.nextInt();
            edges[start][end] = weight;
            edges[end][start] = weight;
        }
        //定义数组表示到1号点到所有点的距离,默认除了到自己是0外,到其他点的距离都是N

        Arrays.fill(length, N);
        length[1] = 0;
        visited[1] = true;
        updateWay(1);
        for (int i = 1; i < 5001; i++) {
            start = getStart();
            if (start == n) {
                System.out.println(length[start]);
                break;
            }
            if (start != 0) {
                updateWay(start);
            }
        }
        if (!visited[n]) {
            System.out.println(-1);
        }

    }

    public static int getStart() {
        int min = N;
        int start = 0;
        for (int i = 1; i < 5001; i++) {
            if (!visited[i]) {
                //如果这个点还没设为已访问
                if (length[i] < min) {
                    //如果这个点的路径已被更新且更小
                    start = i;
                    min = length[i];
                }
            }
        }
        visited[start] = true;
        //System.out.println("目前可到达的未访问点," +start+ "距离最近");
        return start;
    }

    //遍历边集,找出各个与start直接相连的未访问点,将距离更新,并将其设为已访问
    public static void updateWay(int start) {
        for (int i = 1; i < 5001; i++) {
            if (!visited[i]) {
                if (length[i] > length[start] + edges[start][i]) {
                    //System.out.printf("%d与%d相连,距离从%d更新为%d\n",start,i,length[i],length[start] + edges[start][i]);
                    length[i] = length[start] + edges[start][i];

                }
            }
        }
    }
}

全部评论

相关推荐

珩珺:那些经历都太大太空了,实习的情况不了解,大创项目连名字、背景、目的及意义都没体现出来;地摊经济更是看完连卖的什么产品都不知道,项目成果直接写营收多少都更直观真实一点;后面那个校文体部的更是工作内容是组织活动整理流程,成果变成了当志愿者,而且你们学校本科学生会大一入学就直接当部长吗,志愿里面还提到了疫情防控,全面解封是22年12月的事情,可能时间上也有冲突。可能你花了钱人家就用AI给你随便写了点内容改了一下,没什么体现个性化的点
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务