poj 1511

来源:互联网 发布:中国财团知乎 编辑:程序博客网 时间:2024/06/09 13:25

http://poj.org/problem?id=1511

最短路问题

dijkstra邻接表+优先队列算法

正面算一次,反图算一次

题目明明说的不超long long

全部改成long long 才过

代码:

#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <stack>#include <iostream>#include <vector>#include <queue>using namespace std;const long long maxn =1000000001;long long first[1000005];long long next[1000005];long long Nfirst[1000005];long long Nnext[1000005];long long v[1000005];long long u[1000005];long long w[1000005];long long p,q;long long d[1000005];long long down[1000005];long long sum;typedef pair<long long,long long> pii;priority_queue<pii,vector<pii>,greater<pii> > que;long long init(){    for(long long i=1;i<=p;i++)    first[i]=Nfirst[i]=-1;    for(long long i=1;i<=q;i++)    next[i]=Nnext[i]=-1;    for(long long i=1;i<=p;i++)    d[i]=(i==1?0:maxn);    memset(down,0,sizeof(down));    while(!que.empty())    que.pop();}long long dijkstra(){    while(!que.empty())    que.pop();    que.push(make_pair(d[1],1));    while(!que.empty())    {        pii k=que.top();        que.pop();        long long x=k.second;        if(down[k.second]==1)        continue;        down[k.second]=1;        for(long long e=first[x];e!=-1;e=next[e])        {            if(d[v[e]]>d[x]+w[e])            {                d[v[e]]=d[x]+w[e];                que.push(make_pair(d[v[e]],v[e]));            }        }    }    for(long long i=1;i<=p;i++)    if(d[i]!=maxn)    sum+=d[i];    for(long long i=1;i<=p;i++)    d[i]=(i==1?0:maxn);    memset(down,0,sizeof(down));    return 1;}long long Ndijkstra(){    while(!que.empty())    que.pop();    que.push(make_pair(d[1],1));    while(!que.empty())    {        pii k=que.top();        que.pop();        long long x=k.second;        if(down[k.second]==1)        continue;        down[k.second]=1;        for(long long e=Nfirst[x];e!=-1;e=Nnext[e])        {            if(d[u[e]]>d[x]+w[e])            {                d[u[e]]=d[x]+w[e];                que.push(make_pair(d[u[e]],u[e]));            }        }    }    for(long long i=1;i<=p;i++)    if(d[i]!=maxn)    sum+=d[i];}int main(){   long long T;   scanf("%I64d",&T);   while(T--)   {       sum=0;       scanf("%I64d%I64d",&p,&q);       init();       for(long long i=1;i<=q;i++)       {           scanf("%I64d%I64d%I64d",&u[i],&v[i],&w[i]);           next[i]=first[u[i]];           first[u[i]]=i;           Nnext[i]=Nfirst[v[i]];           Nfirst[v[i]]=i;       }       dijkstra();       Ndijkstra();       printf("%I64d\n",sum);   }   return 0;}

SPFA算法

好像就一个用队列,一个用优先队列的区别


#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <stack>#include <iostream>#include <vector>#include <queue>using namespace std;const long long maxn =1000000001;long long first[1000005];long long next[1000005];long long Nfirst[1000005];long long Nnext[1000005];long long v[1000005];long long u[1000005];long long w[1000005];long long p,q;long long d[1000005];long long down[1000005];long long sum;queue<long long> que;long long init(){    for(long long i=1;i<=p;i++)    first[i]=Nfirst[i]=-1;    for(long long i=1;i<=q;i++)    next[i]=Nnext[i]=-1;    for(long long i=1;i<=p;i++)    d[i]=(i==1?0:maxn);    memset(down,0,sizeof(down));}long long dijkstra(){    while(!que.empty())    que.pop();    que.push(1);    down[1]=1;    while(!que.empty())    {        long long x=que.front();        que.pop();        down[x]=0;        for(long long e=first[x];e!=-1;e=next[e])        {            if(d[v[e]]>d[x]+w[e])            {                d[v[e]]=d[x]+w[e];                if(down[v[e]]==0)                que.push(v[e]);            }        }    }    for(long long i=1;i<=p;i++)    if(d[i]!=maxn)    sum+=d[i];    for(long long i=1;i<=p;i++)    d[i]=(i==1?0:maxn);    memset(down,0,sizeof(down));}long long Ndijkstra(){    while(!que.empty())    que.pop();    que.push(1);    down[1]=1;    while(!que.empty())    {        long long x=que.front();        que.pop();        down[x]=0;        for(long long e=Nfirst[x];e!=-1;e=Nnext[e])        {            if(d[u[e]]>d[x]+w[e])            {                d[u[e]]=d[x]+w[e];                if(down[u[e]]==0)                que.push(u[e]);            }        }    }    for(long long i=1;i<=p;i++)    if(d[i]!=maxn)    sum+=d[i];}int main(){   long long T;   scanf("%I64d",&T);   while(T--)   {       sum=0;       scanf("%I64d%I64d",&p,&q);       init();       for(long long i=1;i<=q;i++)       {           scanf("%I64d%I64d%I64d",&u[i],&v[i],&w[i]);           next[i]=first[u[i]];           first[u[i]]=i;           Nnext[i]=Nfirst[v[i]];           Nfirst[v[i]]=i;       }       dijkstra();       Ndijkstra();       printf("%I64d\n",sum);   }   return 0;}



原创粉丝点击