1. 程式人生 > >POJ1511 SPFA水題

POJ1511 SPFA水題

#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;
}