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条道路,通过每条道路需要一定的时间.这个邮递员每 ...
随机推荐
- UIView convertRect
CGRect newRect = [self.view.window convertRect:self.blueView.frame fromView:self.redView]; NSLog(@&q ...
- svn 运行clear up 失败的解决的方法
SVN 的clear up命令失败的解决方法 1. 下载 sqlite3.exe 文件,放到d盘根文件夹. (能够到这里下载 http://download.csdn.net/detail ...
- c#用webkit内核支持html5
[实例简介]经过测试可用 [实例截图] [核心代码] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 using System; ...
- 第四周 Leetcode 124. Binary Tree Maximum Path Sum (HARD)
124. Binary Tree Maximum Path Sum 题意:给定一个二叉树,每个节点有一个权值,寻找任意一个路径,使得权值和最大,只需返回权值和. 思路:对于每一个节点 首先考虑以这个节 ...
- bzoj3550
费用流+线性规划 搞了很长时间... 我们可以设立式子,a[1]+a[2]+a[3]+...+a[n]<=k , ... , a[2 * n + 1]+ ... +a[3*n]<=k a是 ...
- 洛谷P1726 上白泽慧音(Tarjan强连通分量)
P1726 上白泽慧音 题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村 ...
- poj1988Cute Stacking
题目大意:有几个stack,初始里面有一个cube.支持两种操作:1.move x y: 将x所在的stack移动到y所在stack的顶部.2.count x:数在x所在stack中,在x之下的cub ...
- [Swift通天遁地]二、表格表单-(18)快速应用多种预定义格式的表单验证
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 常用mysql记录
多个关键词 like$joinwhere .=" and CONCAT(`JpTel`,`JpName`) Like '%$keywords%' ";
- Http协议详解(转)>>>写的很好
声明:本片文章非原创,仅供自己学习并分享 内容来源于博客园作者MIN飞翔的HTTP协议详解地址http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html ...