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

链接

一个邮递员要从一号点到每个点再回来,求最短路

题目说一次只能去一个点,这样就简单了,求每个点最短路

怎么求回来的最短路?每个点跑一次dijkstra?这样会T

只要反向建边,再求点1到各点的最短路不就行了吗?(可以画个图手算一遍)

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int MAXN = 1010,MAXM = 100010;
const int INF = 0x3f;

int n,m,first1[MAXN],dis[MAXN],first2[MAXN]; ;
int ans=0;

void comput(){
    for(int i=1;i<=n;i++)
        ans+=dis[i];
}

inline int read(){
    int x=0,w=1;
    char c=getchar();
    while(c<‘0‘||c>‘9‘){
        if(c==‘-‘)w=-1;
        c=getchar();
    }
    while(c>=‘0‘&&c<=‘9‘){
        x=(x<<3)+(x<<1)+c-‘0‘;
        c=getchar();
    }
    return x*w;
}

struct edge{
    int u,v,w,next;
}e1[MAXM],e2[MAXM];

struct node{
    int u,dis;
    int operator <(const node &qwq) const{
        return dis>qwq.dis;
    }
};

int qwq=0;
void insert1(int u,int v,int w){
    ++qwq;e1[qwq].u=u;e1[qwq].v=v;e1[qwq].w=w;e1[qwq].next=first1[u];first1[u]=qwq;
}

int tt=0;
void insert2(int u,int v,int w){
    ++tt;e2[tt].u=u;e2[tt].v=v;e2[tt].w=w;e2[tt].next=first2[u];first2[u]=tt;
}

void dijkstra(int first[],edge e[]){
    priority_queue<node> q;
    node start;start.u=1;start.dis=0;
    dis[1]=0;
    q.push(start);
    while(!q.empty()){
        node fr=q.top();
        q.pop();
        int u=fr.u,d=fr.dis;
        if(d!=dis[u])continue;
        for(int i=first[u];i!=-1;i=e[i].next){
            int v=e[i].v,w=e[i].w;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                node rxz;rxz.dis=dis[v];rxz.u=v;
                q.push(rxz);
            }
        }
    }
}

int main(){
    memset(first1,-1,sizeof(first1));memset(first2,-1,sizeof(first2));
    memset(dis,INF,sizeof(dis));
    n=read();m=read();
    for(int i=1;i<=m;i++){
        int u=read(),v=read(),w=read();
        insert1(u,v,w);
        insert2(v,u,w);
    }
    dijkstra(first1,e1);
    comput();
    memset(dis,INF,sizeof(dis));
    dijkstra(first2,e2);
    comput();
    printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/sjrb/p/10351432.html

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

[题解]洛咕P1629 邮递员送信的相关文章

洛谷 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,输入保

洛谷—— 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 邮递员送信(未完成)

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

codevs3872 邮递员送信(SPFA)

邮递员送信 时间限制: 1 Sec  内存限制: 64 MB提交: 10  解决: 5[提交][状态][讨论版] 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条 道路,通过每条道路需要一定的时间.这个邮递员每次只能带一样东西.求送完这N-1样东西并且最终回到邮局最少需要多少时间. 输入 第一行包括两个整数N和M. 第2到第M+1行,每行三个数字U.V.W,表示从A到B有一条需要W时间的道路

邮递员送信(luogu 1629)题解

[问题描述] 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员每次只能带一样东西.求送完这N-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 [样例输出] 83

洛咕11月月赛部分题解 By cellur925

听说是你谷史上最水月赛?我不听我最菜 T1:终于结束的起点 月天歌名好评 给你一个模数 \(M\),请你求出最小的 \(n > 0\),使得\(fib(n)\) \(mod\) \(m=0\),\(fib(n+1)\) \(mod\) \(m=1\). 数学题,开始还想打表验证下,但是我不会告诉你我打表的时候没有很及时地取膜,然后中间有结果溢出,耽误了很长时间,企图找了很久规律.结果发现暴力就能过.hhh. 这个故事告诉我们要及时取膜! #include<cstdio> #include

[题解]洛谷比赛『期末考后的休闲比赛2』

[前言] 这场比赛已经结束了有几天,但我各种忙,虽然AK但还是没来得及写题解.(我才不会告诉你我跑去学数据结构了) T1 区间方差 (就不贴题好了) 首先可以推公式(我们可以知道,线段树然而并不能通过初中学过的方差公式在log(L)内求出方差): (s2表示方差,L表示区间长度,xi表示区间的每一项,最后一个x上画了一根线表示这些数据的平均数) 用二项式定理完全平方公式可得: 再次展开: 另外,再代入以下这个 得到了: 然后继续吧.. 然后duang地一声合并同类项,于是我们得到了: 然后可以高

洛咕P1106

//贪心思路:找降序对//其实主要的收获是知道了string的妙用!(呸 #include<bits/stdc++.h> using namespace std; const int N = 256; string ss; int k; int main() { cin>>ss>>k; int n=ss.length(); for(int i=0;i<k;i++) for(int j=0;j<n;j++){ if((int)ss[j]>(int)ss[