题目描述: 
有一个邮递员要送东西,邮局在节点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。

思路 :

这是一道最短路问题,SPFA算法可以很好的解决。但是题目特殊在最后需要的并不是单一两点间的最短路,而是1到2~N每个点来回最短路程的总和,所以需要以1点为起点做一次SPFA,得到1点到每个点的最短路。而后处理每个点到1之间的最短路。可以将边反向,以求得N个点到1的最短距离,首先运用三个数组U,V,W记录输入的参数,在跑完1到每个点的最短路后,清空vis数组和存储路径信息的邻接表,初始化dis数组,(Tips:各位初次写没初始化的萌新,这里的初始化很重要!!),然后对U,V,W进行遍历,本来为U->V边权为W的路径在这里方向进行反向存储了!!现在要存储的应该是V->U边权为W的路径。这样再一次以1为起点进行一次SPFA,便可以的到每个点到1的最短路(Tips:这里相当于将所有路径反向,也就相当于把1作为终点去找每个点为起点时的返程的最短路

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
;
;
int n,m,cnt,ans,hd[N],dis[N],a[M],b[M],c[M];
bool inq[N];
queue<int>q;
struct edge
{
    int to,nxt,val;
}v[M];
void addedge(int x,int y,int z)
{
    ++cnt;
    v[cnt].to=y;
    v[cnt].nxt=hd[x];
    v[cnt].val=z;
    hd[x]=cnt;
}
int main()
{
    scanf("%d%d",&n,&m);
    ;i<=m;i++)
    {
        scanf("%d%d%d",&a[i],&b[i],&c[i]);
        addedge(a[i],b[i],c[i]);
    }
    memset(dis,0x3f,sizeof(dis));
    dis[]=;
    q.push();
    inq[]=;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        inq[u]=;
        for(int i=hd[u];i;i=v[i].nxt)
            if(dis[v[i].to]>dis[u]+v[i].val)
            {
                dis[v[i].to]=dis[u]+v[i].val;
                if(!inq[v[i].to])
                {
                    inq[v[i].to]=;
                    q.push(v[i].to);
                }
            }
    }
    ;i<=n;i++)
        ans+=dis[i];
    memset(v,,sizeof(v));
    memset(hd,,sizeof(hd));
    cnt=;
    ;i<=m;i++)
        addedge(b[i],a[i],c[i]);
    memset(dis,0x3f,sizeof(dis));
    dis[]=;
    q.push();
    inq[]=;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        inq[u]=;
        for(int i=hd[u];i;i=v[i].nxt)
            if(dis[v[i].to]>dis[u]+v[i].val)
            {
                dis[v[i].to]=dis[u]+v[i].val;
                if(!inq[v[i].to])
                {
                    inq[v[i].to]=;
                    q.push(v[i].to);
                }
            }
    }
    ;i<=n;i++)
        ans+=dis[i];
    printf("%d\n",ans);
    ;
}  

P1629 邮递员送信的更多相关文章

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

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

  2. Luogu P1629 邮递员送信

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

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

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

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

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

  5. 洛谷P1629 邮递员送信

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

  6. 洛谷 P1629 邮递员送信

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

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

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

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

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

  9. yzoj P1412 & 洛谷P1629 邮递员送信 题解

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

随机推荐

  1. PHP Curl模拟登录并抓取数据

    使用PHP的Curl扩展库可以模拟实现登录,并抓取一些需要用户账号登录以后才能查看的数据.具体实现的流程如下(个人总结): 1. 首先需要对相应的登录页面的html源代码进行分析,获得一些必要的信息: ...

  2. IOS 中的JS

     文章摘自: http://www.cocoachina.com/ios/20150127/11037.html  JSContext/JSValue JSContext 即JavaScript代码的 ...

  3. 安装jdk时出现java -version权限不够问题

    今天在ubuntu上安装jdk的时候,最后测试java -version总是不行,出现了 bash: /home/jdk1.7.0_25/bin/java: 权限不够的问题 百度之后,在http:// ...

  4. Leetcode题解(十八)

    51.N-Queens ---------------------------------------------------------------------------------分割线---- ...

  5. 用正则表达式(regex)匹配多项式(polynomial)

    因为作业的要求,我需要识别用户从命令行输入的多项式,并且要提取出其中的系数.指数以便用于后续计算. 曾经想过用一个数组把用户所有的输入全部存进来,然后在写逻辑判断.但想想那复杂的逻辑,头皮都发麻,这时 ...

  6. css媒体查询:响应式网站

    css媒体查询:响应式网站 媒体查询 包含了一个媒体类型和至少一个使用如宽度.高度和颜色等媒体属性来限制样式表范围的表达式.CSS3加入的媒体查询使得无需修改内容便可以使样式应用于某些特定的设备范围. ...

  7. 让盒子两端对齐小技巧 => inline-block

    今天在项目中碰到了设计盒子两端对齐的栗子,咱们用inline-block方法轻松的解决了,下面是我的经验: 原理: 利用文字text-align:justify; 操纵inline-block盒子,能 ...

  8. linux7.2系统中安装Nmon并使用

    前提 安装linux系统中遇到一个问题,设置ip以后则ping不通,简单总结几步: 1.设置ip 进入 /etc/sysconfig/network-scripts目录下,修改文件名为ifcfg-en ...

  9. [转载] Redis-benchmark使用总结

    转载自http://blog.csdn.net/jiangguilong2000/article/details/24143721 Redis-benchmark为Redis性能测试工具. 指令说明: ...

  10. linux操作系统基础篇(五)

    Linux网络以及rpm安装yum源的配置 1.Linux网络 1. 使用ifconfig命令来维护网络1) fconfig命令的功能:显示所有正在启动的网卡的详细信息或设定系统中网卡的IP地址.2) ...