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\n",ans); return 0; }
OVER:
点关注不迷路,点推荐不妄心
标签:送信,终点,int,Floyd,单源,Ford,邮递员,P1629,dis 来源: https://www.cnblogs.com/LightyaChoo/p/13231986.html