目录

  • 题目描述
  • C++代码

题目描述

有一个邮递员要送东西,邮局在节点 1 1 1。他总共要送 n − 1 n-1 n−1 样东西,其目的地分别是节点 2 2 2 到节点 n n n。由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有 m m m 条道路。这个邮递员每次只能带一样东西,并且运送每件物品过后必须返回邮局。求送完这 n − 1 n-1 n−1 样东西并且最终回到邮局最少需要的时间。

输入格式

第一行包括两个整数, n n n 和 m m m,表示城市的节点数量和道路数量。

第二行到第 ( m + 1 ) (m+1) (m+1) 行,每行三个整数, u , v , w u,v,w u,v,w,表示从 u u u 到 v v v 有一条通过时间为 w w w 的道路。

输出格式

输出仅一行,包含一个整数,为最少需要的时间。

样例 #1

样例输入 #1

5 10
2 3 5
1 5 5
3 5 6
1 2 8
1 3 8
5 3 4
4 1 8
4 5 3
3 5 6
5 4 2

样例输出 #1

83

提示

对于 30 % 30\% 30% 的数据, 1 ≤ n ≤ 200 1 \leq n \leq 200 1≤n≤200。

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 3 1 \leq n \leq 10^3 1≤n≤103, 1 ≤ m ≤ 1 0 5 1 \leq m \leq 10^5 1≤m≤105, 1 ≤ u , v ≤ n 1\leq u,v \leq n 1≤u,v≤n, 1 ≤ w ≤ 1 0 4 1 \leq w \leq 10^4 1≤w≤104,输入保证任意两点都能互相到达。


  • 从邮局出发到各个邮寄点肯定是单源最短路问题,即用dijkstra,考虑到本题数据量,存图需要用带权的链式前向星,并且还要再需堆优化一下;而折返回来时就属于多源单终点问题,但仍可以套dijkstra做,但需要再建一个存反向边的图。

C++代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int, int> PII;     //first:与源点距离   second:结点编号const int N = 1e5 + 10;/*** @brief 两遍dijkstra,从邮局过去一遍是单源多点最短路,所以可按照原本建边的顺序直接dijkstra* 回来的时候是多源单终点问题,但也可以转换为为dijkstra做,只用反向再建一下边* <-------反向建边的时候注意设置一个+n的偏移量来防止建边冲突-------->*/int e[2 * N], ne[2 * N], h[2 * N], w[2 * N];
int dist[2 * N];
bool st[2 * N];
int n, m, idx = 0;
int res = 0;       //要走的所有路程
priority_queue<PII, vector<PII>, greater<PII>> heap;        //按照源点距离排的小根堆void add(int a, int b, int c){e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}void dijkstra(int s){memset(dist, INF, sizeof dist);dist[s] = 0;heap.push({0, s});while(heap.size()){PII t = heap.top();heap.pop();int ver = t.second, distance = t.first;if(st[ver])     continue;st[ver] = true;for(int i = h[ver];i != -1;i = ne[i]){int j = e[i];if(w[i] + distance < dist[j]){dist[j] = w[i] + distance;heap.push({dist[j], j});}}}
}int main(){scanf("%d %d", &n, &m);memset(h, -1, sizeof h);while(m --){int u, v, z;scanf("%d %d %d", &u, &v, &z);add(u, v, z);add(v + n, u + n, z);               //反向再建一遍图,+ n对每个点做一个偏移}dijkstra(1);for(int i = 1;i <= n;i ++)      res += dist[i];dijkstra(1 + n);for(int i = 1 + n;i <= n + n;i ++)      res += dist[i];cout << res << endl;return 0;
}

洛谷 P1629 - 邮递员送信(往返两遍dijkstra)相关推荐

  1. 洛谷P1629 邮递员送信(最短路径)

    题目描述: 有一个邮递员要送东西,邮局在节点 1.他总共要送 n−1 样东西,其目的地分别是节点 2 到节点 n.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有 m 条道路.这个邮递员每次 ...

  2. P1629邮递员送信与P1342请柬与P1821银牛派队研制联合胜利

    P1342 请柬 P1629 邮递员送信 P1821 [USACO07FEB]银牛派对Silver Cow Party 三倍经验 这三道题思想比较像的,只不过第一道的数据大了很多,于是就成蓝题了. 因 ...

  3. P1629 邮递员送信-dijkstra+反向建边

    邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点 111.他总共要送 n−1n-1n−1 样东西,其目的地分别是节点 222 到节点 nnn.由于这个城市的交通比较繁忙,因此所有的道路都是单行的 ...

  4. 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】

    题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双 ...

  5. 洛谷:P2832 行路难(堆优化Dijkstra(错解)bfs(正解) + 记录路径)

    洛谷:P2832 行路难 写这道题确实是行路难- 此题的最短路约束不只是边权,还有边数(每经过一条边,之后经过的边权值都 +1+1+1 ) 从期望的角度分析,我们肯定是想 尽可能走的路程越短,走得路径 ...

  6. P1629 邮递员送信(最短路)

    题目描述 有一个邮递员要送东西,邮局在节点 1.他总共要送 n-1样东西,其目的地分别是节点 2到节点 n.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有 m条道路.这个邮递员每次只能带一 ...

  7. P1629 邮递员送信(正反向建图 or 暴力)

    题目链接 https://www.luogu.com.cn/problem/P1629 思路 和农场派对这题一样,我们需要正反向建图,然后跑迪杰斯特拉然后再分别加上[2,n][2,n][2,n]的di ...

  8. 洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery dijkstra 最短路

    题目链接: https://www.luogu.org/problem/P3003 思路: 1:最短路水题,dijkstra AC 2:spfa 10个测试点过8个,2个TLE 代码: 1:dijks ...

  9. 【菜鸟进阶之路】P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two - 洛谷

    一.题目部分 选自洛谷: P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two 二.解题过程 思路 见"提交AC答案"部分给出的注释 提交AC答案 #i ...

最新文章

  1. 《千只鹤》--[日]川端康成
  2. 分布式事务的实现原理
  3. Aurora公式编辑器在64位Word 2013不显示选项卡
  4. mysql锁机制为何设计如此复杂_再谈mysql锁机制及原理—锁的诠释
  5. data spring 指定时区_SpringBoot 统一时区的方案
  6. MyEclipse 中自动安插作者、注释日期等快捷键方法
  7. linux watch 文件大小,Linux watch命令的使用
  8. 轮播有可能出现的问题
  9. 卷积神经网络计算题试题_卷积神经网络的计算
  10. 字符变量赋值规则_Java的常量、变量、数据类型(基础篇二)
  11. 4.Flow Layout Pane
  12. 熊猫DataFrame apply()示例
  13. Silverlight 中的 CoreCLR
  14. LNAMP服务器环境(源码安装)
  15. 苹果cmsv10模板全局响应式自适应模板电影网站模板源码
  16. 鼠标成十字html,鼠标变成十字如何恢复
  17. 那些著名的黑客事件 四
  18. 计算机无法连接蓝牙键盘,电脑如何连接无线键盘_电脑上怎么连接蓝牙键盘-win7之家...
  19. mac修改mysql密码(亲测)
  20. 常用汇编命令OD命令总结

热门文章

  1. linux系统dvr播放器下载,LINUX顶级应用 打造LINUX之DVR数位监控系统
  2. 足球大数据预测实战之高胜率盈亏条件验证及优化算法
  3. 【Python3爬虫】破解同程旅游加密参数 antitoken-爬虫深度技术
  4. Mask_RCNN翻译和详解笔记一(原文翻译+源代码+代码使用说明)
  5. 动态数据可视化图表制作,我只用这款软件
  6. 【180720】打字游戏源码
  7. 解决windows未识别的网络问题
  8. 暴风影音打开文件连接服务器失败,常见问题:解决暴风影音播放问题
  9. SPSS Modeler 数据定义(指南 第二章)
  10. 网件R6400内网穿透最简单的实现方式