http://acm.dlut.edu.cn/problem.php?id=1218(不知道能不能进去。。。。)
第一次用spfa,第一次用邻接表,留个纪念。。
代码:
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = 10010;
typedef long long ll;
const ll INF = 1e18;
struct bb
{
int v;
ll w;
};
queue<int>q;
vector<bb>bian[maxn];
ll dis[maxn];
bool inqueue[maxn];
int n,m;
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;
int m=bian[u].size();
for(int i=0;i<m;i++){
if(dis[u]+bian[u][i].w<dis[bian[u][i].v]){
dis[bian[u][i].v]=dis[u]+bian[u][i].w;
if(!inqueue[bian[u][i].v]){
inqueue[bian[u][i].v]=true;
q.push(bian[u][i].v);
}
}
}
}
return dis[T];
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int u,v;
ll w;
scanf("%d%d%lld",&u,&v,&w);
bb bia;
bia.v=v;
bia.w=w;
bian[u].push_back(bia);
}
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;
for(int i=1;i<=n;i++)
bian[i].clear();
}
}