https://vjudge.net/contest/66569#problem/K
相当于模板吧,第一次写spfa的
#include<iostream> #include<cstdio> #include<queue> #define ll long long using namespace std; const int N=1001000,inf=1000000000; ll d[N]; struct { int to,next,w; }e[N]; int H[N],x[N],y[N],z[N],V,E,num; void add(int a,int b,int cost) { e[num].w=cost; e[num].to=b; e[num].next=H[a]; H[a]=num++; } void init() { for(int i=1;i<=V;i++) { d[i]=inf;//距离初始化为无穷大 H[i]=-1;//H【i】未访问过 } num=0; } ll spfa() { d[1]=0; bool vis[N]; for(int i=1;i<=V;i++)vis[i]=0; queue<int>Q; Q.push(1); vis[1]=1; while(!Q.empty()){ int t=Q.front(); Q.pop(); for(int k=H[t];k!=-1;k=e[k].next) { int w=e[k].w,v=e[k].to; if(w+d[t]<d[v]) { d[v]=w+d[t]; if(!vis[v]) { vis[v]=1; Q.push(v); } } } } ll cnt=0; for(int i=1;i<=V;i++)cnt+=d[i]; return cnt; } int main() { int n; scanf("%d",&n); while(n--){ scanf("%d%d",&V,&E); init(); for(int i=0;i<E;i++) { scanf("%d%d%d",&x[i],&y[i],&z[i]); add(x[i],y[i],z[i]); } ll ans=0; ans+=spfa(); init(); for(int i=0;i<E;i++) { add(y[i],x[i],z[i]); } ans+=spfa(); printf("%lld\n",ans); } }