#include<cstdio> #include<iostream> #include<queue> #include<cstring> using namespace std; const int maxn = 10010; typedef long long ll; const ll INF = 1e18; struct Side{ int to,next; ll w; }side[50010]; int top; int node[maxn]; void add_side(int u,int v,ll w){ side[top]=(Side){v,node[u],w}; node[u]=top++; } ll dis[maxn]; bool inqueue[maxn]; int n,m; queue<int>q; ll spfa(int S,int T){ for(int i=1;i<=n;i++){ inqueue[i]=false; dis[i]=INF; } q.push(S); dis[S]=0; while(!q.empty()){ int u = q.front();q.pop(); inqueue[u]=false; for(int i=node[u];i!=-1;i=side[i].next){ int v=side[i].to; if(dis[u]+side[i].w<dis[v]){ dis[v]=dis[u]+side[i].w; if(!inqueue[v]){ inqueue[v]=true; q.push(v); } } } } return dis[T]; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); top=0; memset(node,-1,sizeof(node)); for(int i=0;i<m;i++){ int u,v; ll w; scanf("%d%d%lld",&u,&v,&w); add_side(u,v,w); } int a,b,c; scanf("%d%d%d",&a,&b,&c); ll ans=0; ans+=spfa(a,b); ans+=spfa(b,c); cout<<ans<<endl; } }
原文:http://blog.csdn.net/u013889359/article/details/22947403