poj 1511
最短路用spfa写的
#include<queue>
#include<iostream>
#include<cstring>
#define max 100000500
using namespace std;
long long int t,n,m,a,b,c,d1[1000500],d2[1000500],flag[1000500],head2[1000500],head1[1000500];
long long int sum;
struct e
{
int to,w,pre;
};
e edge1[1000500],edge2[1000500];
void spfa(e edge[1000500],long long int d[1000500],long long int head[1000500])
{
queue<int> q;
for(int i=1;i<=n;i++)
{
d[i]=max;
flag[i]=0;
}
d[1]=0;
q.push(1);
while(!q.empty())
{
int now=q.front();
q.pop();
flag[now]=0;
for(int k=head[now];k!=-1;k=edge[k].pre)
{
if(d[edge[k].to]>d[now]+edge[k].w)
{
d[edge[k].to]=d[now]+edge[k].w;
if(flag[edge[k].to]==0)
{
q.push(edge[k].to);
flag[edge[k].to]=1;
}
}
}
}
for(int i=1;i<=n;i++)
{
sum+=d[i];
}
}
int main()
{
cin>>t;
while(t--)
{
memset(head1,-1,sizeof head1);
memset(head2,-1,sizeof head2);
sum=0;
int k=1;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&a,&b,&c);
edge1[k].to=b;
edge1[k].w=edge2[k].w=c;
edge2[k].to=a;
edge1[k].pre=head1[a];
edge2[k].pre=head2[b];
head1[a]=head2[b]=k;
k++;
}
spfa(edge1,d1,head1);
spfa(edge2,d2,head2);
cout<<sum<<endl;
}
}

浙公网安备 33010602011771号