惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
G
Google Developers Blog
小众软件
小众软件
V
V2EX
月光博客
月光博客
腾讯CDC
aimingoo的专栏
aimingoo的专栏
J
Java Code Geeks
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
D
Docker
M
MIT News - Artificial intelligence
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
MongoDB | Blog
MongoDB | Blog
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
#题解/P3371 【模板】单源最短路径(弱化版)
hermanO · 2026-04-30 · via 博客园_首页

知识点

dijkstra算法

介绍 :dijkstra算法用于求解有权图求最短路的问题

具体过程

1.将起始点的dis置为0.
2.选择当前未标记的顶点中dis值最小的一个。
3.对该顶点的所有连边依次进行松弛操作。
4.对该点进行标记。
5.重复第(2)步至第(4)步,直到不存在一条边从已标记顶点通往未标记点的连边

还有一点没说

搞清楚邻接表邻接矩阵适用于什么情况

如果不懂连边,松弛操作等名词含义欢迎拜读我的博客点我

解释:dis数组是用于记录到目前为止起点到各顶点的最短路长度

关于dis数组的细节初始化,在初始化的时候先将整个数组设置为inf,inf:表示无穷大,一般开成1e18-1或者1e9-1

题外话

其实这个算法和BFS求无权图最短路的思路差不多,基础不好的就像我一样 有点搞不懂这个dijkstra函数的形参也就是graph数组他其实存的就是比如\(u \to v\) 代价为w,那么就是graph[u].push_back({w,v}),就是存u点到v点的边权(代价),在主函数初始化的时候你可以注意到
当然我这个代码用堆优化了,也就是优先队列,也要搞懂优先队列的作用,总之你一定要知道你现在要干嘛,等下要干嘛,一定要有思路

#include <bits/stdc++.h>
using namespace std ;

#define int long long 

vector<int>Dijkstra(int start,int n,vector<vector<pair<int,int> > >& graph)
{
    const int INF = INT_MAX ;
    vector<int>dis(n+1,INF) ;
    dis[start] = 0 ;
  //存{距离,节点} 
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int> > >q;
    q.push({0,start});
    while(!q.empty())
    {
        int d = q.top().first ;
        int u = q.top().second ;
        q.pop() ;
        if(d > dis[u]) continue ;/*
在堆优化的 Dijkstra 中,我们无法直接更新队列内部某个节点的值。所以,当发现一条更短的路径时,我们并不是“修改”队列里的旧距离,而是直接塞进去一个新的、更短的距离。
这就导致:同一个节点在队列里可能同时存在多份数据。*/
//简单来说,它的核心作用是:跳过那些已经被发现“不是最短”的路径信息
        for(auto & edge : graph[u])
        {
            int v = edge.first ; //目标节点
            int w = edge.second ; //边权
            if(dis[u] + w < dis[v])
            {
                dis[v] = dis[u] + w ;
                q.push({dis[v],v}) ;
            }
        }
    }
    return dis ;
}

signed main()
{
    ios::sync_with_stdio(false),cin.tie(nullptr) ;
    
    int n,m,s;
    cin >> n >> m >> s;
    // 邻接表:graph[u]存储从u出发的所有边 {v, w}
    vector<vector<pair<int, int>>> graph(n + 1);  // 1-indexed
    for(int i = 0;i < m;i++)
    {
        int u,v,w;
        cin >> u >> v >> w ;
        graph[u].push_back({v, w});
    }
    vector<int> dist = Dijkstra(s, n, graph);
    
     for (int i = 1; i <= n; i++) {
        if (dist[i] == INT_MAX) {
            cout << 2147483647 << " ";  // 不能到达
        } else {
            cout << dist[i] << " ";
        }
    }
    cout << endl;

    return 0 ;
}