poj3159最短路spfa+邻接表

https://vjudge.net/contest/66569#problem/K

相当于模板吧,第一次写spfa的

#include<iostream>
#include<cstdio>
#include<queue>
#define ll long long
using namespace std;
const int N=1001000,inf=1000000000;
ll d[N];
struct {
    int to,next,w;
}e[N];
int H[N],x[N],y[N],z[N],V,E,num;
void add(int a,int b,int cost)
{
    e[num].w=cost;
    e[num].to=b;
    e[num].next=H[a];
    H[a]=num++;
}
void init()
{
    for(int i=1;i<=V;i++)
    {
       d[i]=inf;//距离初始化为无穷大 
       H[i]=-1;//H【i】未访问过 
    }
    num=0;
}
ll spfa()
{
    d[1]=0;
    bool vis[N];
    for(int i=1;i<=V;i++)vis[i]=0;
    queue<int>Q;
    Q.push(1);
    vis[1]=1;
    while(!Q.empty()){
        int t=Q.front();
        Q.pop();
        for(int k=H[t];k!=-1;k=e[k].next)
        {
            int w=e[k].w,v=e[k].to;
            if(w+d[t]<d[v])
            {
                d[v]=w+d[t];
                if(!vis[v])
                {
                    vis[v]=1;
                    Q.push(v);
                } 
            }
        } 
    }
    ll cnt=0;
    for(int i=1;i<=V;i++)cnt+=d[i];
    return cnt;
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--){
        scanf("%d%d",&V,&E);
        init();
        for(int i=0;i<E;i++)
        {
            scanf("%d%d%d",&x[i],&y[i],&z[i]);
            add(x[i],y[i],z[i]);
        }
        ll ans=0;
        ans+=spfa();
        init();
        for(int i=0;i<E;i++)
        {
            add(y[i],x[i],z[i]);
        }
        ans+=spfa();
        printf("%lld\n",ans);
    }
} 

 

posted @ 2017-03-04 22:54  walfy  阅读(206)  评论(0编辑  收藏  举报