邮递员从1出发到n,再从n到1,求最短的距离,第一次正向建边,进行一次dijkstra,再反向建边,再进行一次fdijkstra即可。
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=1005;
struct node{
int v,w;
node(int v,int w):v(v),w(w){}
bool operator<(const node & t)const{
return w>t.w;
}
};
vector<node>adj[maxn],fadj[maxn];
int vis[maxn];
int dis[maxn],fdis[maxn];
void dijkstra(int s){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
priority_queue<node>q;
q.push(node(s,dis[s]));
while(!q.empty()){
int u=q.top().v;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i].v;
int w=adj[u][i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
q.push(node(v,dis[v]));
}
}
}
}
void fdijkstra(int s){
memset(fdis,0x3f,sizeof(fdis));
memset(vis,0,sizeof(vis));
fdis[s]=0;
priority_queue<node>q;
q.push(node(s,fdis[s]));
while(!q.empty()){
int u=q.top().v;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=0;i<fadj[u].size();i++){
int v=fadj[u][i].v;
int w=fadj[u][i].w;
if(fdis[v]>fdis[u]+w){
fdis[v]=fdis[u]+w;
q.push(node(v,fdis[v]));
}
}
}
}
int main(){
cin>>n>>m;
int a,b,c;
for(int i=0;i<m;i++){
cin>>a>>b>>c;
adj[a].push_back(node(b,c));
fadj[b].push_back(node(a,c));
}
dijkstra(1);
int ans=0;
for(int i=2;i<=n;i++)
ans+=dis[i];
fdijkstra(1);
for(int i=1;i<=n;i++)
ans+=fdis[i];
cout<<ans<<endl;
return 0;
}