poj1511(SPFA)

来源:互联网 发布:线切割如何编程软件 编辑:程序博客网 时间:2024/06/08 11:04
#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#define For(i,j,k) for(i=j;i<=k;++i)long long TT,n,m,next[1000010],to[1000010],begin[1000010],we[1000010],h,t;long long u[1000010],v[1000010],w[1000010],e,q[5000010],dis[1000010],ifin[1000010];long long sum;void add(long long u,long long v,long long w){to[++e]=v;we[e]=w;next[e]=begin[u];begin[u]=e;}int main(){long long i;scanf("%I64d",&TT);while (TT--) {sum=0;memset(begin,0,sizeof(begin));memset(next,0,sizeof(next));scanf("%I64d%I64d",&n,&m);For(i,1,m)scanf("%I64d%I64d%I64d",&u[i],&v[i],&w[i]);e=0;memset(ifin,0,sizeof(ifin));For(i,1,m)add(u[i],v[i],w[i]);q[1]=1;ifin[1]=1;h=0;t=1;For(i,2,n)dis[i]=9999999999999999;while (h<t) {++h;ifin[h]=0;for(i=begin[q[h]];i;i=next[i]) {long long uu=q[h],vv=to[i];if (dis[uu]+w[i]<dis[vv]) {dis[vv]=dis[uu]+w[i];if (!ifin[vv]) {ifin[vv]=1;q[++t]=vv;}}}}For(i,2,n)sum+=dis[i];For(i,2,n)dis[i]=9999999999999999;e=0;memset(begin,0,sizeof(begin));memset(next,0,sizeof(next));For(i,1,m)add(v[i],u[i],w[i]);q[1]=1;ifin[1]=1;h=0;t=1;memset(ifin,0,sizeof(ifin));while (h<t) {++h;ifin[h]=0;for(i=begin[q[h]];i;i=next[i]) {long long uu=q[h],vv=to[i];if (dis[uu]+w[i]<dis[vv]) {dis[vv]=dis[uu]+w[i];if (!ifin[vv]) {ifin[vv]=1;++t;q[t]=vv;}}}}For(i,2,n)sum+=dis[i];printf("%I64d\n",sum);}return 0;}

1 0
原创粉丝点击