洛谷 P1629 邮递员送信

P1629 邮递员送信

题目描述

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

输出格式:

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

输入输出样例

输入样例#1: 复制

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

输出样例#1: 复制

83
思路:正反建图,跑两边spfa
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100100
using namespace std;
int n,m,x,tot,tot1;
int dis[MAXN],dis1[MAXN],vis[MAXN];
int to[MAXN],net[MAXN],cap[MAXN],head[MAXN];
int to1[MAXN],net1[MAXN],cap1[MAXN],head1[MAXN];
void add(int u,int v,int w){
    to[++tot]=v;net[tot]=head[u];cap[tot]=w;head[u]=tot;
}
void add1(int u,int v,int w){
    to1[++tot1]=v;net1[tot1]=head1[u];cap1[tot1]=w;head1[u]=tot1;
}
void spfa(int s){
    queue<int>que;
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    que.push(s);dis[s]=0;vis[s]=1;
    while(!que.empty()){
        int now=que.front();
        que.pop();vis[now]=0;
        for(int i=head[now];i;i=net[i])
            if(dis[to[i]]>dis[now]+cap[i]){
                dis[to[i]]=dis[now]+cap[i];
                if(!vis[to[i]]){
                    vis[to[i]]=1;
                    que.push(to[i]);
                }
            }
    }
}
void spfa1(int s){
    queue<int>que;
    memset(vis,0,sizeof(vis));
    memset(dis1,0x3f,sizeof(dis1));
    que.push(s);dis1[s]=0;vis[s]=1;
    while(!que.empty()){
        int now=que.front();
        que.pop();vis[now]=0;
        for(int i=head1[now];i;i=net1[i])
            if(dis1[to1[i]]>dis1[now]+cap1[i]){
                dis1[to1[i]]=dis1[now]+cap1[i];
                if(!vis[to1[i]]){
                    vis[to1[i]]=1;
                    que.push(to1[i]);
                }
            }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add1(y,x,z);
    }
    spfa(1);spfa1(1);int ans=0;
    for(int i=2;i<=n;i++)
        ans+=dis[i]+dis1[i];
    cout<<ans;
}
 

原文地址:https://www.cnblogs.com/cangT-Tlan/p/8413184.html

时间: 2024-07-30 02:16:12

洛谷 P1629 邮递员送信的相关文章

洛谷—— P1629 邮递员送信

https://www.luogu.org/problem/show?pid=1629 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每次只能带一样东西.求送完这N-1样东西并且最终回到邮局最少需要多少时间. 输入输出格式 输入格式: 第一行包括两个整数N和M. 第2到第M+1行,每行三个数字U.V.W,表示从A到B有一条需要W时间的道路. 满足

[题解]洛咕P1629 邮递员送信

链接 一个邮递员要从一号点到每个点再回来,求最短路 题目说一次只能去一个点,这样就简单了,求每个点最短路 怎么求回来的最短路?每个点跑一次dijkstra?这样会T 只要反向建边,再求点1到各点的最短路不就行了吗?(可以画个图手算一遍) 代码: #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<queue> using namesp

P1629 邮递员送信(未完成)

题目描述 有一个邮递员要送东西,邮局在节点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,输入保证任意两点都能互相到达.

最短路 P1629 邮递员送信

传送门 其实这一道题还是比较不错的 这一道题的题意稍微转化一下就是邮递员要到一个节点 然后再返回 求最短路 这我们很显然是可以用dijkstra算法的 我们先按照题目中给的边(单向边) 跑一边最短路 接下来一步我们是要求从各个点出发到S的最短路 乍一看很复杂的样子 其实只需要把整张图的边全部倒过来存储 然后再从起点开始跑一边最短路就可以了! 下面是代码(其实敲起来还是很简单的 练练代码熟练度~) #include<bits/stdc++.h> #define pa pair<int,in

洛谷——P1821 [USACO07FEB]银牛派对Silver Cow Party

P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads co

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不