洛谷 P1629 邮递员送信-反向建边
洛谷 P1629 邮递员送信
题目描述:
有一个邮递员要送东西,邮局在节点 11。他总共要送 n-1n−1 样东西,其目的地分别是节点 22 到节点 nn。由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有 mm 条道路。这个邮递员每次只能带一样东西,并且运送每件物品过后必须返回邮局。求送完这 n-1n−1 样东西并且最终回到邮局最少需要的时间。
思路:
正常跑一遍\(Dijkstra\),之后再反向建边再跑一遍\(Dijkstra\),将两遍的最短路径长度加起来就是答案。
对于反向建边,我的处理方法是用一个类封装链式前向星,每条边正着添加到\(g_1\)中,反着添加到\(g_2\)中。
也有dl用一个链式前向星存正反两个图,在存反向边的时候将每个点都加上\(n\)(点的数量)。
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
const int Maxn = 100005;
const int INF = 0x3f3f3f3f;
struct Node {
int pos, dis;
Node(){}
Node(int pos, int dis):pos(pos), dis(dis){}
bool operator < (const Node &x) const {
return dis > x.dis;
}
};
class G {
public:
struct EDGE {
int v, w, next;
} e[Maxn];
int head[Maxn], tot;
G(){tot = 1;}
void add(int u, int v, int w) {
e[tot].v = v;
e[tot].w = w;
e[tot].next = head[u];
head[u] = tot++;
}
} g1, g2;
int dis[Maxn], vis[Maxn];
void dijkstra(int s, G g) {
memset(dis, INF, sizeof dis);
memset(vis, 0, sizeof vis);
dis[s] = 0;
std::priority_queue<Node>q;
q.push(Node(s, 0));
for (; !q.empty();) {
Node f = q.top();
q.pop();
if (vis[f.pos]) {
continue;
}
vis[f.pos] = true;
for (int i = g.head[f.pos]; i; i = g.e[i].next) {
int v = g.e[i].v;
int w = g.e[i].w;
if (dis[v] > dis[f.pos] + w) {
dis[v] = dis[f.pos] + w;
q.push(Node(v, dis[v]));
}
}
}
}
void solve() {
int n, m;
scanf("%d %d", &n, &m);
int u, v, w;
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &u, &v, &w);
g1.add(u, v, w);
g2.add(v, u, w);
}
dijkstra(1, g1);
int ans = 0;
for (int i = 1; i <= n; i++) {
ans += dis[i];
}
dijkstra(1, g2);
for (int i = 1; i <= n; i++) {
ans += dis[i];
}
printf("%d\n", ans);
}
int main() {
solve();
return 0;
}
洛谷 P1629 邮递员送信-反向建边的更多相关文章
- 洛谷——P1629 邮递员送信
P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...
- 洛谷 P1629 邮递员送信 题解
P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...
- 洛谷P1629 邮递员送信
题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...
- 洛谷 P1629 邮递员送信
题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...
- 洛谷—— P1629 邮递员送信
https://www.luogu.org/problem/show?pid=1629 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比 ...
- yzoj P1412 & 洛谷P1629 邮递员送信 题解
有一个邮递员要送东西,邮局在结点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每次只能带一 ...
- 洛谷P1629 邮递员送信 最短路-Djistra
先上一波题目qwq https://www.luogu.org/problem/P1629· 复习了一波 dijstra 的 priority_queue(优先队列)优化的写法 tips: 求单项路中 ...
- Luogu P1629 邮递员送信
P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...
- P1629 邮递员送信
题目描述: 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员 ...
随机推荐
- 【Oracle】translate函数用法解析
转自:https://blog.csdn.net/shwanglp/article/details/52814173 基本语法: translate(string,from_str,to_str); ...
- mount: /dev/sdxx already mounted or /xxxx busy解决方法
异常现象: 解决方法: 1. 輸入root的密碼,進入單用戶2. 重新掛載/目錄,使其變為可讀可寫 # mount –o rw,remount / 3. 修改/etc/fstab文件 ...
- wmic 查看主板信息
查看主板信息的一个命令:wmic baseboard get 当然在命令提示符里查看,真的很费劲,所以我们将命令格式化一下:wmic baseboard get /format:HFORM >c ...
- 2.4V升5V芯片,8uA功耗,低功耗升压电路图
2.4V升5V,可用于USB拔插充电,也可以用于把两节镍氢电池2.4V升压到5V,的固定输出稳压电压值,同时输出电流可达1A,0.5A等 首先是先说下0.5A的这款的话,是比较低功耗的,8uA左右的输 ...
- centos7搭建dolphinscheduler集群
一.简述 Apache DolphinScheduler是一个分布式去中心化,易扩展的可视化DAG工作流任务调度系统.致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用.有 ...
- uni-app开发经验分享十八:对接第三方h5
1.uni-app中对接第三方为了防止跳出app使用了webview <template> <view> <web-view :src="url" @ ...
- 浅析Asp.Net Core框架IConfiguration配置
目录 一.建造者模式(Builder Pattern) 二.核心接口与配置存储本质 三.简易QueryString配置源实现 四.宿主配置与应用配置 一.建造者模式 为什么提建造者模式?在阅读.NET ...
- 宝塔Linux命令
安装宝塔 Centos安装脚本 5.7:yum install -y wget && wget -O install.sh http://download.bt.cn/install/ ...
- What is the difference between Serialization and Marshaling?
How to serialize and deserialize JSON using C# - .NET | Microsoft Docs https://docs.microsoft.com/en ...
- Google performance Tools (gperftools) 使用心得
Google performance Tools (gperftools) 使用心得 gperftools是google开发的一款非常实用的工具集,主要包括:性能优异的malloc free内存分配器 ...