P1629 邮递员送信

P1629 邮递员送信:

题目描述:

 输入格式:

输出格式:

 输入输出样例:

输入 #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

说明/提示:

 分析:

因为一次送一个邮件,所以送完一个要回到邮局也就是1号节点,所以这就成了个单源多终点最短路+多源单终点的问题,其实那解决的就是多源单终点的问题,我们把它转换同样的单源多终点的问题,这么转,就是再见一个反向图,也就是把路的所有的方向倒过来建图,在求两个图的单源多终点最短路,那么就有很多方法,Dijkstra,Spfa,Ford,Floyd,呵呵,我第一次就是用Floyd做的,确实是写起来很简单也很短,但TLE了N个点,所以(怕麻烦,别学我,这几种方法都打打)改成了Ford。

Code:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,ans;
int u[N],v[N],w[N];
int dis[N];
void ford(){
    for(int i=1;i<=n;i++)dis[i]=1e9;
    dis[1]=0;
    for(int k=1;k<=n;k++){
        for(int i=1;i<=m;i++){
            if(dis[v[i]]>dis[u[i]]+w[i]){
                dis[v[i]]=dis[u[i]]+w[i];
            }
        }
    }
}


int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&u[i],&v[i],&w[i]);
    }
    ford();
    for(int i=1;i<=n;i++)ans+=dis[i];
    for(int i=1;i<=m;i++){
        swap(u[i],v[i]);
    }
    ford();
    for(int i=1;i<=n;i++)ans+=dis[i];
    printf("%d
",ans);
    return 0;
}

OVER:

点关注不迷路,点推荐不妄心

原文地址:https://www.cnblogs.com/LightyaChoo/p/13231986.html