[题解]邮递员寄信(luoguP1629)

题目来源:luoguP1629

题目描述

有一个邮递员要送东西,邮局在结点1.他总共要送N-1样东西,其目的地分别是2-N。由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间。这个邮递员每次只能带一样东西。求送完这N-1样东西并且最终回到邮局最少需要多少时间。

输入输出格式

输入格式:

第一行包含两个正整数N和M;

接下来M行,每行三个正整数U,V,W,表示该条道路为从U到V的,且通过这条道路需要W的时间。满足1≤U,V≤N,1≤W≤10000,输入保证任意两点都能互相到达。

输出格式:

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

输入输出样例

输入样例:

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

输出样例:

83

说明

数据规模:

对于30%的数据,1≤N≤200;

对于100%的数据,1≤N≤1000,1≤M≤100000。

题目分析

分析

首先每次只能带一个东西,知道这个就不用多想了 da\(^o^)/ ,求总路径最短,不就是求每个的来回路径最短吗?那么我们正反向建边加 dijstra + 堆优化 秒切。

关于反向建边的原理,我们可以这样想,将A到B的边改为B到A,那么A节点到B节点的路径不就是原来B节点到A节点的路径吗?这样当然就可以用 dijstra 去做了。

代码

 1 #include<iostream>
 2 #include<fstream>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 const int Max_N=1e6+5;
 7 
 8 int n,resA=-1,resB=-1;
 9 int A[Max_N];
10 
11 int main()
12 {    
13     scanf("%d",&n);
14     register int i,j;
15     for(i=1;i<=n;i++)
16         scanf("%d",&A[i]);
17     sort(A+1,A+1+n);
18     for(i=1;i<=n;i+=2)
19         if(A[i]^A[i+1]){
20             if(resA==-1)
21                 resA=A[i];
22             else
23                 resB=A[i];
24             i--;
25         }
26     if(resA>resB) swap(resA,resB);
27     printf("%d %d\n",resA,resB);
28     return 0;
29 }
View Code

写在最后的话:

题解仅供思路,要想成为 dalao ,请学会并尽量会做到教他人甚至自己写题解。

博主(目前)是一名初二蒟蒻,如有问题还请大家指出,一起交流学习!

Happy every day!        ——2019.4.11

 

posted @ 2019-04-28 13:21  Happydaylhp  阅读(181)  评论(0编辑  收藏  举报