题目描述: 
有一个邮递员要送东西,邮局在节点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. LeetCode 598. Range Addition II (范围加法之二)

    Given an m * n matrix M initialized with all 0's and several update operations. Operations are repre ...

  2. Go语言中slice使用注意事项

    Go 语言中的slice类型可以理解为是数组array类型的描述符,包含了三个因素: 指向底层数组的指针 slice目前使用到的底层数组的元素个数,即长度 底层数组的最大长度,即容量 因此当我们定义一 ...

  3. lintcode 132 模式

    题目要求 给你一个 n 个整数的序列 a1,a2,...,an,一个 132 模式是对于一个子串 ai,aj,ak,满足 i < j < k 和 ai < ak < aj.设计 ...

  4. 【hihoCoder】#1039 : 字符消除 by C solution

    #1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消 ...

  5. struts2(五)之struts2拦截器与自定义拦截器

    前言 前面介绍了struts2的输入验证,如果让我自己选的话,肯定是选择xml配置校验的方法,因为,能使用struts2中的一些校验规则,就无需自己编写了, 不过到后面应该都有其他更方便的校验方法,而 ...

  6. Winsock网络编程笔记(4)----基本的理论知识

    前面的笔记记录了Winsock的入门编程,领略了Winsock编程的乐趣..但这并不能算是掌握了Winsock,加深理论知识的理解才会让后续学习更加得心应手..因此,这篇笔记将记录一些有关Winsoc ...

  7. Cup

    Cup Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  8. C# join子句

    join 子句可用于将来自不同源序列并且在对象模型中没有直接关系的元素相关联. 唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值. 例如,食品经销商可能拥有某种产品的供应商列表以及 ...

  9. ajax参数解析

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

  10. 获取 修改 CSS 样式

    内联(style里的)样式 element.style.color element.style.getPropertyValue("color")   非内联样式 window.g ...