zoukankan      html  css  js  c++  java
  • [题解]邮递员寄信(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
    ",resA,resB);
    28     return 0;
    29 }
    View Code

    写在最后的话:

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

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

    Happy every day!        ——2019.4.11

  • 相关阅读:
    1 let和const
    ECMAScript 6 扫盲
    回溯法
    13. Ajax技术
    12.JSTL标签
    11.EL(表达式语言)
    10.正则表达式(未完成)
    博客园自定义样式
    9.一次简单的Web作业
    8.JavaScript
  • 原文地址:https://www.cnblogs.com/lihepei/p/10783424.html
Copyright © 2011-2022 走看看