洛谷—— P1629 邮递员送信

https://www.luogu.org/problem/show?pid=1629

题目描述

有一个邮递员要送东西,邮局在节点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

正反两边SPFA
 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5
 6 using namespace std;
 7
 8 const int N(1000+5);
 9 const int M(100005);
10 int n,m;
11 long long ans;
12 int hed[N],had[N],sumedge;
13 struct Edge
14 {
15     int v,next,w;
16     Edge(int v=0,int next=0,int w=0):
17         v(v),next(next),w(w){}
18 }edge[M<<1];
19 inline void ins(int u,int v,int w,int *head)
20 {
21     edge[++sumedge]=Edge(v,head[u],w);
22     head[u]=sumedge;
23 }
24
25 bool inq[N];
26 queue<int>que;
27 int dis1[N],dis2[N];
28 inline void SPFA_1()
29 {
30     memset(dis1,127/3,sizeof(dis1));
31     dis1[1]=0; que.push(1); inq[1]=1;
32     for(int u,v;!que.empty();)
33     {
34         u=que.front(); que.pop(); inq[u]=0;
35         for(int i=hed[u];i;i=edge[i].next)
36         {
37             v=edge[i].v;
38             if(dis1[v]>dis1[u]+edge[i].w)
39             {
40                 dis1[v]=dis1[u]+edge[i].w;
41                 if(!inq[v]) inq[v]=1,que.push(v);
42             }
43         }
44     }
45 }
46 inline void SPFA_2()
47 {
48     memset(dis2,127/3,sizeof(dis2));
49     dis2[1]=0; que.push(1); inq[1]=1;
50     for(int u,v;!que.empty();)
51     {
52         u=que.front(); que.pop(); inq[u]=0;
53         for(int i=had[u];i;i=edge[i].next)
54         {
55             v=edge[i].v;
56             if(dis2[v]>dis2[u]+edge[i].w)
57             {
58                 dis2[v]=dis2[u]+edge[i].w;
59                 if(!inq[v]) inq[v]=1,que.push(v);
60             }
61         }
62     }
63 }
64
65 int main()
66 {
67     scanf("%d%d",&n,&m);
68     for(int u,v,w,i=1;i<=m;i++)
69     {
70          scanf("%d%d%d",&u,&v,&w);
71          ins(u,v,w,hed);ins(v,u,w,had);
72     }
73     SPFA_1(); SPFA_2();
74     for(int i=2;i<=n;i++) ans+=(long long)dis1[i]+dis2[i];
75     printf("%lld\n",ans);
76     return 0;
77 } 
时间: 2024-09-29 19:42:43

洛谷—— P1629 邮递员送信的相关文章

洛谷 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,输入保

[题解]洛咕P1629 邮递员送信

链接 一个邮递员要从一号点到每个点再回来,求最短路 题目说一次只能去一个点,这样就简单了,求每个点最短路 怎么求回来的最短路?每个点跑一次dijkstra?这样会T 只要反向建边,再求点1到各点的最短路不就行了吗?(可以画个图手算一遍) 代码: #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<queue> using namesp

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,输入保证任意两点都能互相到达.

最短路 P1629 邮递员送信

传送门 其实这一道题还是比较不错的 这一道题的题意稍微转化一下就是邮递员要到一个节点 然后再返回 求最短路 这我们很显然是可以用dijkstra算法的 我们先按照题目中给的边(单向边) 跑一边最短路 接下来一步我们是要求从各个点出发到S的最短路 乍一看很复杂的样子 其实只需要把整张图的边全部倒过来存储 然后再从起点开始跑一边最短路就可以了! 下面是代码(其实敲起来还是很简单的 练练代码熟练度~) #include<bits/stdc++.h> #define pa pair<int,in

洛谷——P1821 [USACO07FEB]银牛派对Silver Cow Party

P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads co

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不