P1629 邮递员送信
题目大概意思就是货物从顶点1运到其他顶点后,需要返回顶点1,总路程要最短
开始从一号顶点到其他顶点,是一对多,回的时候是多对一,我们可以这样看这个问题,去的时候我们用一遍最短路,回的时候再用一遍最短路,这样便得到了最短的路径
注意:我们在回的时候需要的是反方向的走,要将方向反过来,建立一个反转函数就好了
#include<bits/stdc++.h>
using namespace std;
#define inf 2147482648
#define maxn 1000100
typedef long long ll;
int n,m;
int dis[maxn];
int u[maxn],v[maxn],w[maxn];
unsigned long long ans=0;
void BellmanFord(){
for(int i=1;i<=n;i++)
dis[i]=inf;
dis[1]=0;
for( int k=1;k<=n-1;k++){
int check=0;
for(int i=1;i<=m;i++){
if(dis[v[i]]>dis[u[i]]+w[i]){
dis[v[i]]=dis[u[i]]+w[i];
check=1;
}
}
if(check==0)
break;
}
}
void CountAns(){
for(int i=1;i<=n;i++)
ans+=dis[i];
}
void over(){
for(int i=1;i<=m;i++)
swap(u[i],v[i]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>u[i]>>v[i]>>w[i];
BellmanFord();
CountAns();
over();
BellmanFord();
CountAns();
cout<<ans;
}
可以像我这样用两个函数来进行最短路和路程的计算,这样方便点