POJ1511 SPFA水題
阿新 • • 發佈:2019-01-05
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<algorithm> #define For(i,j,k) for (i=j;i<=k;i++) using namespace std; const int dmax=1001000,INF=1000000000; int begin[dmax],next[dmax],to[dmax],w[dmax]; int begin1[dmax],next1[dmax],to1[dmax],w1[dmax]; int q[dmax*10],d[dmax]; bool p[dmax]; int e,e1,m,n; void add(int x,int y,int z){ to[++e]=y; w[e]=z; next[e]=begin[x]; begin[x]=e; } void add1(int x,int y,int z){ to1[++e1]=y; w1[e1]=z; next1[e1]=begin1[x]; begin1[x]=e1; } int reload(){ int x,y,z,i,j,k; For(i,1,m) begin[i]=begin1[i]=0; For(i,1,m){ scanf("%d%d%d",&x,&y,&z); add(x,y,z); add1(y,x,z); } } int main(){ int i,j,k,f,l,T; long long ans; scanf("%d",&T); while (T--){ scanf("%d%d",&n,&m); reload(); For(i,1,n){ d[i]=INF; p[i]=0; } ans=0; q[1]=1,p[1]=1,d[1]=0; f=0,l=1; while (f<l){ k=q[++f],p[k]=0; for (i=begin[k];i>0;i=next[i]) if (d[to[i]]>d[k]+w[i]){ d[to[i]]=d[k]+w[i]; if (!p[to[i]]){ q[++l]=to[i]; p[to[i]]=1; } } } For(i,2,n) ans+=d[i]; For(i,1,n){ d[i]=INF; p[i]=0; } q[1]=1,p[1]=1,d[1]=0; f=0,l=1; while (f<l){ k=q[++f],p[k]=0; for (i=begin1[k];i>0;i=next1[i]) if (d[to1[i]]>d[k]+w1[i]){ d[to1[i]]=d[k]+w1[i]; if (!p[to1[i]]){ q[++l]=to1[i]; p[to1[i]]=1; } } } For(i,2,n) ans+=d[i]; printf("%I64d\n",ans); } return 0; }