SPFA 邻接表模式

来源:互联网 发布:淘宝模板代码怎么关闭 编辑:程序博客网 时间:2024/06/06 01:57

poj 1511


一个SPFA 题意是:在一个城市里,有n(1~1000000)个运输中心,有m条有向路连接着任意的两个运输中心。ACM组织(位于编号为1的运输中心)要派发p个雇佣员工早上前往这p个运输中心去发传单,晚上再让他们都回到组织中。问所有人所走路程的总和最短是多少?


#include <vector>#include <iostream>#include <string>#include <map>#include <stack>#include <cstring>#include <queue>#include <list>#include <cstdio>#include <set>#include <algorithm>#include <cstdlib>#include <cmath>#include <iomanip>#include <cctype>#include <sstream>#include <functional>using namespace std;#define LL long long#define INF 1000000050#define endl '\n'#define me(x) memset(x,0,sizeof(x));//const LL INF = 1e15;const int maxn=1e3+5;const int maxx=1e6+5;int n,m;struct node{    int e,w,next;}E[maxx],G[maxx];int head1[maxx],head2[maxx];int d[maxx],inq[maxx];LL sum;void init(){    memset(head1,-1,sizeof(head1));    memset(head2,-1,sizeof(head2));    memset(E,0,sizeof(E));    memset(G,0,sizeof(G));}void spfa1(){    queue<int >Q;    memset(inq,0,sizeof(inq));    for(int i=0;i<=n;i++)        d[i]=INF;    Q.push(1),d[1]=0,inq[1]=1;    while(!Q.empty())    {        int now=Q.front();        Q.pop();        inq[now]=0;        for(int i=head1[now];i!=-1;i=E[i].next)        {            int v=E[i].e;            if(d[v]>d[now]+E[i].w)            {                d[v]=d[now]+E[i].w;                if(inq[v]==1) continue;                inq[v]=1;                Q.push(v);            }        }    }    for(int i=1;i<=n;i++)        sum+=d[i];}void spfa2(){    queue<int >Q;    memset(inq,0,sizeof(inq));    for(int i=0;i<=n;i++)        d[i]=INF;    Q.push(1),d[1]=0,inq[1]=1;    while(!Q.empty())    {        int now=Q.front();        Q.pop();        inq[now]=0;        for(int i=head2[now];i!=-1;i=G[i].next)        {            int v=G[i].e;            if(d[v]>d[now]+G[i].w)            {                d[v]=d[now]+G[i].w;                if(inq[v]==1) continue;                inq[v]=1;                Q.push(v);            }        }    }    for(int i=1;i<=n;i++)        sum+=d[i];}void solve(){    sum=0;    scanf("%d%d",&n,&m);    init();    for(int i=1;i<=m;i++)    {        int x,y,z;        scanf("%d%d%d",&x,&y,&z);        E[i].e=y;        E[i].next=head1[x];        E[i].w=z;        head1[x]=i;        G[i].e=x;        G[i].next=head2[y];        G[i].w=z;        head2[y]=i;    }    spfa1();spfa2();    printf("%I64d\n",sum);}int main(){    int t;    scanf("%d",&t);    while (t--)    {        solve();    }}


0 0