poj 1511

最短路用spfa写的

 
#include<cstdio>

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

posted @ 2015-08-06 17:32  澧浦  阅读(102)  评论(0)    收藏  举报