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。

输出格式:

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

输入输出样例

输入样例#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

我们看到这个题首先想到的就是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 邮递员送信的更多相关文章

  1. 洛谷——P1629 邮递员送信

    P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...

  2. 洛谷 P1629 邮递员送信 题解

    P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...

  3. 洛谷 P1629 邮递员送信-反向建边

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

  4. 洛谷—— P1629 邮递员送信

    https://www.luogu.org/problem/show?pid=1629 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比 ...

  5. 洛谷P1629 邮递员送信 最短路-Djistra

    先上一波题目qwq https://www.luogu.org/problem/P1629· 复习了一波 dijstra 的 priority_queue(优先队列)优化的写法 tips: 求单项路中 ...

  6. 洛谷P1629 邮递员送信

    题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...

  7. P1629 邮递员送信

    题目描述: 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员 ...

  8. 洛谷 P1629 邮递员送信

    题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...

  9. P1629 邮递员送信(未完成)

    题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每 ...

随机推荐

  1. 分布式数据库中间件DDM的实现原理

    随着数据量不断增大,传统的架构模式难以解决业务量不断增长所带来的问题,特别是在业务成线性.甚至指数级上升的情况.此时我们不得不通过水平扩展,把数据库放到不同服务器上来解决问题,也就是我们说的数据库中间 ...

  2. Android资源文件命名规范

    在复杂Android应用的开发中,资源文件的规范命名非常重要,能帮助设计人员和开发人员减小沟通成本.资源的名字尽量力求准确,可以适当长一些,但换回的价值是值得的. 关于WCC的Android开发,资源 ...

  3. css高级:font-size

    body{ font:62.5%/1.6em "Lucida Grande",Verdana,Geneva,Helvetica,Arial,sansserif; }//font-s ...

  4. JDK部分源码阅读与理解

    本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/JDK部分源码阅读与理解/ 不喜欢重复造轮子,不喜欢贴各种东西.JDK ...

  5. 20170623_oracle基础知识_常见问题

    1 如何配置网络服务?两种连接 Oracle 工具? 1) 打开Net Manager 2) 选择服务命名,点击“+ ”号 3 ) 网络服务名:  remote协议:tcp/ip 主机名:ip地址 端 ...

  6. B1068 [SCOI2007]压缩 区间dp

    这个题我状态想对了,但是转移错了...dp的代码难度都不大,但是思考含量太高了..不会啊,我太菜了. 其实这个题就是一个正常的区间dp,中间多了一个特判的转移就行了. 题干: Description ...

  7. git-更改本地和远程分支的名称

    git branch -m old_branch new_branch # Rename branch locally git push origin :old_branch # Delete the ...

  8. 43. ExtJs控件属性配置详细

    转自:https://www.cnblogs.com/mannixiang/p/6558225.html 序言:    1.本文摘自网络,看控件命名像是4.0以前的版本,但控件属性配置仍然可以借鉴(不 ...

  9. [Swift通天遁地]七、数据与安全-(12)使用Instruments Leaks工具检测内存泄露

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. vagrant使用centos的环境安装..

    vagrant这货挺好用的..简要就是, 下好virtualbox, vagrant, 然后下个你需要的box. 然后vagrant box add boxname boxpath就行. 然后在合适的 ...