[题解]邮递员寄信(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 }
写在最后的话:
题解仅供思路,要想成为 dalao ,请学会并尽量会做到教他人甚至自己写题解。
博主(目前)是一名初二蒟蒻,如有问题还请大家指出,一起交流学习!
Happy every day! ——2019.4.11