算法十三:最短路 绝地灬酷狼 2022-05-23 20:07 133阅读 0赞 问题描述 给定一张 n 个点的无向带权图,节点的编号从 1 至 n,求从 S 到 T 的最短路径长度。 ### 输入格式 ### 第一行 4 个数 n,m,S, T,分别表示点数、边数、起点、终点。 接下来 m 行,每行 3 个正整数 u,v,w,描述一条 u 到 v 的双向边,边权为 w。 保证 1<=u,v<=n。 ### 输出格式 ### 输出一行一个整数,表示 S 到 T 的最短路。 ### 样例输入 ### 7 11 5 4 (7个点,11条边,起点是5,终点是4) 2 4 2 1 4 3 7 2 2 3 4 3 5 7 5 7 3 3 6 1 1 6 3 4 2 4 3 5 6 3 7 2 1 ### 样例图解 ### ![70][] ### ### ### 样例输出 ### 7(3+1+3) ### 数据范围 ### 本题共设置 12 个测试点。 对于前 10 个测试点,保证 n<=2500,m<=6200,对于每条边有 w<=1000。这部分数据有梯度。 对于所有的 12 个测试点,保证 n<=100,000,m<=250,000。 ### 提示 ### \[本题是 Dijkstra 算法的模板练习题。\] \[使用朴素的 Dijkstra 算法可以通过前 10 个测试点。\] \[使用堆或\_\_std::priority\_queue\_\_优化的 Dijkstra 算法可以通过所有测试点。\] ### 一. 伪代码 ### ![70 1][] ![70 2][] ### 二. 具体实现(C++) ### \#include <bits/stdc++.h> using namespace std; // ================= 代码实现开始 ================= const int N = 100005; typedef pair<int,int> pii; //graph:存放图,graph\[i\]表示的是节点i的出边,其中first存储到达的节点,second存储边权 //pq:辅助Dijkstra算法的优先队列 //flag:记录每个节点是否进行过松弛,1表示进行过,0表示未进行过 //mind:存储起点s到每个节点的最短路径长度 vector<pii> graph\[N\]; priority\_queue<pii,vector<pii>,greater<pii>> pq; bool flag\[N\]; int mind\[N\]; // 这个函数用于计算答案(最短路) // n:节点数目 // m:双向边数目 // U,V,W:分别存放各边的两端点、边权 // s,t:分别表示起点、重点 // 返回值:答案(即从 s 到 t 的最短路径长度) int shortestPath(int n, int m, vector<int> U, vector<int> V, vector<int> W, int s, int t) \{ while(!pq.empty()) pq.pop(); for(int i=1; i<=n; ++i) graph\[i\].clear(); memset(mind,127,sizeof(mind)); memset(flag,0,sizeof(flag)); //建图,连接图中各边 for(int i=0; i<m; ++i)\{ graph\[U\[i\]\].push\_back(make\_pair(V\[i\],W\[i\])); graph\[V\[i\]\].push\_back(make\_pair(U\[i\],W\[i\])); \} //设置起点的最短路为0,并将起点加入到优先队列中 mind\[s\] = 0; pq.push(make\_pair(mind\[s\],s)); //执行Dijkstra算法 while(!flag\[t\])\{ int u = pq.top().second; pq.pop(); if(!flag\[u\])\{ //每个节点最多做一次松弛 flag\[u\] = 1; for(vector<pii>::iterator it = graph\[u\].begin(); it != graph\[u\].end(); ++it)\{ //枚举所有u出发的边 int v = it->first, w = it->second; if(mind\[v\] <= mind\[u\]+w) continue; mind\[v\] = mind\[u\] + w; pq.push(make\_pair(mind\[v\],v));//将v伴随其最新的最短路径长度加入优先队列 \} \} \} return mind\[t\]; \} // ================= 代码实现结束 ================= [70]: /images/20220524/3f7e79f736cf440faadff30bb53cc24e.png [70 1]: /images/20220524/826bec749ba24e65b2e6af231dcf7d49.png [70 2]: /images/20220524/3fd9b9c04fff49289b2ddd653ed52be3.png
相关 最短路 <table> <tbody> <tr> <td> <h2>最短路</h2> <strong>Time Limit: 5000/1000 MS (Java/O 向右看齐/ 2024年02月18日 22:54/ 0 赞/ 46 阅读
相关 最短路 \[hdu 1599\] ([http://acm.hdu.edu.cn/showproblem.php?pid=1599][http_acm.hdu.edu.cn_showp 红太狼/ 2022年08月04日 08:28/ 0 赞/ 166 阅读
相关 C--最短路 Problem Description 给出一个带权无向图,包含n个点,m条边。求出s,e的最短路。保证最短路存在。 Input 多组输入。 对于每组数据。 以你之姓@/ 2022年07月12日 08:26/ 0 赞/ 125 阅读
相关 最短路 队列+松弛操作 读取队头顶点u,并将队头顶点u出队(记得消除标记);将与点u相连的所有点v进行松弛操作,如果能更新估计值(即令d\[v\]变小),那么就更新,另外,如果 忘是亡心i/ 2022年06月11日 04:06/ 0 赞/ 207 阅读
相关 最短路 一下模板均已通过HDUOJ 2544 程序设计竞赛队空间和时间复杂度要求都很高,所以朴素的Dijkstra[算法][Link 1]无论时间还是空间,效率都很低。 所以,一般 淡淡的烟草味﹌/ 2022年06月09日 04:28/ 0 赞/ 243 阅读
相关 算法十三:最短路 问题描述 给定一张 n 个点的无向带权图,节点的编号从 1 至 n,求从 S 到 T 的最短路径长度。 输入格式 第一行 4 个数 n,m,S, T,分别表示点数、边 绝地灬酷狼/ 2022年05月23日 20:07/ 0 赞/ 134 阅读
相关 最短路径(Dijkstra)-HDU 2544-最短路 最短路径(Dijkstra)-HDU 2544-最短路 -------------------- 题目链接: [最短路][Link 1] 亦凉/ 2022年05月14日 03:38/ 0 赞/ 211 阅读
相关 最短路 最短路 典型用途:交通网络的问题——从甲地到乙地之间是否有公路连通?在有多条通路的情况下,哪一条路最短? 交通网络用有向网来表示:顶点——表示城市,弧——表示两个城 淡淡的烟草味﹌/ 2022年03月18日 12:35/ 0 赞/ 254 阅读
相关 最短路 Floyed [http://codevs.cn/problem/1077/][http_codevs.cn_problem_1077] include<cstdi ﹏ヽ暗。殇╰゛Y/ 2021年11月18日 00:30/ 0 赞/ 293 阅读
相关 最短路 复习下图论算法 1. 邻接表的Dijkstra ![ContractedBlock.gif][] ![ExpandedBlockStart.gif][] / 冷不防/ 2021年11月02日 14:24/ 0 赞/ 449 阅读
还没有评论,来说两句吧...