最短路径Dijkstra新版

import java.util.*;

public class Main {
    static Scanner sc = new Scanner(System.in);
    static final int INF = Integer.MAX_VALUE;
    
    // 边类:存储邻接表中的边信息
    static class Edge {
        public Edge(Integer t, Integer w) {
            this.t = t;  // 目标节点
            this.w = w;  // 边权重
        }
        Integer t;  // 目标节点编号
        Integer w;  // 边的权重
    }
    
    public static void main(String[] args) {
        // 输入:n个节点,m条边
        int n, m;
        n = sc.nextInt();
        m = sc.nextInt();

        // 邻接表:graph[i]表示从节点i出发的所有边
        List<List<Edge>> graph = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }
        
        // 建图过程
        int s, t, w;
        for (int i = 0; i < m; i++) {
            s = sc.nextInt();  // 起点
            t = sc.nextInt();  // 终点  
            w = sc.nextInt();  // 权重
            
            boolean found = false;
            // 检查是否已存在s->t的边(处理重边)
            for (Edge edge : graph.get(s)) {
                if (edge.t.equals(t)) {  // 找到相同边
                    if (edge.w > w) {    // 保留最小权重
                        edge.w = w;
                    }
                    found = true;
                    break;
                }
            }
            // 如果没有找到相同边,添加新边
            if (!found) {
                graph.get(s).add(new Edge(t, w));
            }
        }
        
        // Dijkstra算法核心数据结构
        int[] mindist = new int[n + 1];    // 最短距离数组:mindist[i] = 从起点1到i的最短距离
        boolean[] visited = new boolean[n + 1];  // 访问标记数组:visited[i] = 节点i是否已确定最短路径
        int start = 1, end = n;  // 起点为1,终点为n
        
        // 初始化:起点距离为0,其他为无穷大
        Arrays.fill(mindist, INF);
        mindist[start] = 0;

        // Dijkstra主循环:执行n次(最多n个节点)
        for (int i = 1; i <= n; i++) {
            int cur = -1;      // 当前选择的节点
            int minVal = INF;  // 当前最小距离
            
            // 在未访问节点中找距离最小的节点
            for (int j = 1; j <= n; j++) {
                if (!visited[j] && mindist[j] < minVal) {
                    minVal = mindist[j];
                    cur = j;
                }
            }
            
            // 如果没有可选节点,提前退出
            if (cur == -1) break;
            visited[cur] = true;  // 标记当前节点已确定最短路径

            // 松弛操作:更新当前节点的所有邻接点距离
            for (Edge edge : graph.get(cur)) {
                // 如果通过cur到edge.t的距离更短,则更新
                if (mindist[cur] + edge.w < mindist[edge.t]) {
                    mindist[edge.t] = mindist[cur] + edge.w;
                }
            }
        }
        
        // 输出结果
        if (mindist[end] == INF) {  // 无法到达终点
            System.out.println(-1);
        } else {  // 可达,输出最短距离
            System.out.println(mindist[end]);
        }
        
        sc.close();
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
公司:阿里巴巴集团部门:淘天场景金融技术部地点:杭州岗位要求【学历要求】全日制本科及以上学历【专业要求】计算机/软件工程/人工智能/大数据/大模型/数学等相关专业【专业技能】编程基础:具备扎实的工程实践能力和良好的代码规范意识,至少熟练掌握一种主流编程语言(如Python/Java/Go/JavaScript/TypeScript等),能够熟练使用Vibe&nbsp;Coding来解决实际问题,有相关实习经验者优先。算法基础:有深厚的算法功底,在CV(计算机视觉)或&nbsp;NLP(自然语言处理)方向有扎实的理论基础,能够理解大模型底层运行相关基础知识,有顶会或重要期刊论文发表者优先。LLM基础:对大语言模型(LLM)具备系统性认知,熟悉大模型应用开发中的关键技术,如&nbsp;Prompt&nbsp;Engineering、RAG、Function&nbsp;Calling、Agent&nbsp;Workflow、上下文管理、记忆机制、MCP、SKILLS等。了解Zero-shot、Few-shot、CoT、ReAct等常见提示词方法。工程实践:了解AI&nbsp;Agent的基本原理、任务规划机制及工具调用流程,能够理解单Agent/多Agent&nbsp;的典型架构设计。熟悉或使用过主流Agent应用开发框架,如LangChain、Dify、OpenClaw等,能够基于框架进行工作流编排、工具接入和应用搭建。具备一定的系统设计意识,能够结合业务场景完成Agent应用原型设计、能力扩展与工程落地。【核心素质】技术好奇心:有很强的技术好奇心,具备快速啃透前沿论文(Paper)的能力,并能将理论知识转化为工程代码,如有自己独立完成的小项目(开源项目或个人&nbsp;Demo)验者优先。简历可发送邮箱:&nbsp;**********
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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