Luogu P1629 邮递员送信
P1629 邮递员送信
题目描述
有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N。由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间。这个邮递员每次只能带一样东西。求送完这N-1样东西并且最终回到邮局最少需要多少时间。
输入输出格式
输入格式:
第一行包括两个整数N和M。
第2到第M+1行,每行三个数字U、V、W,表示从A到B有一条需要W时间的道路。 满足1<=U,V<=N,1<=W<=10000,输入保证任意两点都能互相到达。
【数据规模】
对于30%的数据,有1≤N≤200;
对于100%的数据,有1≤N≤1000,1≤M≤100000。
输出格式:
输出仅一行,包含一个整数,为最少需要的时间。
输入输出样例
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
我们看到这个题首先想到的就是Floyd,因为这是有向边,而且邮递员出去之后还要再回来的嘛。
but应该只能拿一部分分,因为范围太大Ο(n^3)跑不动,
那么就另寻他路喽。
(绞尽脑汁终于想了出来)
建两张图,跑两遍dijkstra就能过了,至于为什么,看下面
我们先正常的建图,这个跑出来是到每一个节点的距离然后把这些距离加起来,存到ANS里面,然后反向建一张图,为啥呢?
因为我们反向建一张图再跑的时候从别的点回到起点的边就变成了从起点到别的点,这是我们跑出来的结果就是从每一个节点再回到起点的距离,把这些距离也加到ANS中,到最后输出ANS就可以了
啦啦啦啦啦啦啦 上代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define MAXN 100005
#define INF 2147483647 using namespace std; int n, m, cnt;
long long ans;
int u[MAXN], v[MAXN], w[MAXN];
int first[MAXN], next[MAXN];
bool book[MAXN];
int ddd[1005][1005];
int dis[1005];
int uu[MAXN], vv[MAXN], ww[MAXN];
int f[MAXN], nn[MAXN]; int main() {
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++) {
dis[i] = INF;
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
ddd[i][j] = INF;
dis[1] = 0;
memset(f, -1, sizeof(f));
memset(first, -1, sizeof(first));
for(int i=1; i<=m; i++) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
ddd[x][y] = min(ddd[x][y], z);
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(ddd[i][j] != INF) {
cnt++;
u[cnt] = i, v[cnt] = j, w[cnt] = ddd[i][j];
next[cnt] = first[u[cnt]];
first[u[cnt]] = cnt;
uu[cnt] = j, vv[cnt] = i, ww[cnt] = ddd[i][j];
nn[cnt] = f[uu[cnt]];
f[uu[cnt]] = cnt;
}
}
}
for(int i=1; i<n; i++) {
int minn = INF, x;
for(int j=1; j<=n; j++) {
if(minn > dis[j]&&book[j] == 0) {
minn = dis[j];
x = j;
}
}
book[x] = 1;
int k = first[x];
while(k != -1) {
if(dis[v[k]] > dis[u[k]]+w[k]) {
dis[v[k]] = dis[u[k]]+w[k];
}
k = next[k];
}
}
for(int i=2; i<=n; i++) {
// if(dis[i] != INF)
ans += dis[i];
}
for(int i=1; i<=n; i++) {
dis[i] = INF;
}
dis[1] = 0;
memset(book, 0, sizeof(book));
for(int i=1; i<n; i++) {
int minn = INF, h;
for(int j=1; j<=n; j++) {
if(minn > dis[j]&&book[j] == 0) {
minn = dis[j];
h = j;
}
}
book[h] = 1;
int k = f[h];
while(k != -1) {
if(dis[vv[k]] > dis[uu[k]]+ww[k]) {
dis[vv[k]] = dis[uu[k]]+ww[k];
}
k = nn[k];
}
}
for(int i=2; i<=n; i++) {
// if(dis[i] != INF)
ans += dis[i];
}
printf("%lld\n",ans);
}
Luogu P1629 邮递员送信的更多相关文章
- 洛谷——P1629 邮递员送信
P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...
- 洛谷 P1629 邮递员送信 题解
P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...
- 洛谷 P1629 邮递员送信-反向建边
洛谷 P1629 邮递员送信 题目描述: 有一个邮递员要送东西,邮局在节点 11.他总共要送 n-1n−1 样东西,其目的地分别是节点 22 到节点 nn.由于这个城市的交通比较繁忙,因此所有的道路都 ...
- 洛谷—— P1629 邮递员送信
https://www.luogu.org/problem/show?pid=1629 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比 ...
- 洛谷P1629 邮递员送信 最短路-Djistra
先上一波题目qwq https://www.luogu.org/problem/P1629· 复习了一波 dijstra 的 priority_queue(优先队列)优化的写法 tips: 求单项路中 ...
- 洛谷P1629 邮递员送信
题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...
- P1629 邮递员送信
题目描述: 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员 ...
- 洛谷 P1629 邮递员送信
题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...
- P1629 邮递员送信(未完成)
题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...
随机推荐
- C语言控制台窗体图形界面编程(总结)
本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...
- 解析java中volatilekeyword
在java多线程编程中常常volatile,有时候这个keyword和synchronized 或者lock常常有人混淆.详细解析例如以下: 在多线程的环境中会存在成员变量可见性问题: java的每一 ...
- ios17--自定义控件2改进
控制器: // // XMGViewController.h #import <UIKit/UIKit.h> @interface XMGViewController : UIViewCo ...
- ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)
前面的六篇文章,我们已经讨论了dapm关于动态电源管理的有关知识,包括widget的创建和初始化,widget之间的连接以及widget的上下电顺序等等.本章我们准备讨论dapm框架中的另一个机制:事 ...
- strok函数用法【转】
本文转载自:http://blog.csdn.net/hexiechina2010/article/details/25096763 char *strtok( char *strToken, con ...
- hibernate基础简单入门1---helloword
1:目录结果 2:实体类(student.java) package com.www.entity; public class Student { private int id; private St ...
- discuz的全局变量
$_G 保存了 discuz! 中所有的预处理数据 缓存能够很好的提高程序的性能,一些配置数据没必要每次都查询数据库,只要在修改了的时候更新下缓存即可. Discuz! 中所有的缓存保存在 $_G[c ...
- smarty用法
smarty学习指南 在smarty的模板设计部分我简单的把smarty在模板中的一些常用设置做了简单的介绍,这一节主要来介绍一下如何在smarty中开始我们程序设计.下载Smarty文件放到你们站点 ...
- akka设计模式系列-慎用ask
慎用ask应该是Akka设计的一个准则,很多时候我们应该禁用ask.之所以单独把ask拎出来作为一篇博文,主要是akka的初学者往往对ask的使用比较疑惑. "Using ask will ...
- ZOJ 3666 博弈 SG函数
SG函数: 对于任意状态,定义SG(x)=mex(S),其中S是x的后继状态的SG函数值集合,mex(S)表示不再S内的最小非负整数 SG(X)=0当且仅当x为必败态. 解: 构造一个有向无环图(树) ...