#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