poj 1511 邻接表+堆优化的dijstra

来源:互联网 发布:一元微信提现赚钱软件 编辑:程序博客网 时间:2024/05/21 17:33

这题最终的意思很简单,输入图,求出从源点到所有点的最短路,再把这个图的所有边反向,再求一次源点到所有点的最短路。

这个和poj另一道题很相似,合适这题 的意义在于数据。

你这个图是无法用邻接矩阵存下的,因为邻接矩阵太大了,你只能用邻接表。

那么这个题就是用邻接表的用优先队列优化过的dijstra过的了。

(其实堆优化就是用优先队列而已,不和那些人装样子……)

注意这个图的所有边反向是怎么实现的。

AC代码:

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <queue>using namespace std;const int maxe=1e6+10;const int maxv=1e6+10;const int inf=0x3f3f3f3f;typedef long long ll;int  N,M;int restore[maxe][3];int which=1;int head[maxv];struct EDGE{    int d,w,next;    EDGE():next(-1){}}e[maxv];void add(int s, int d,int w){    e[which].d=d;    e[which].w=w;    e[which].next=head[s];    head[s]=which++;}void initforgraph(){    memset(head,-1,sizeof(head));    memset(e,0,sizeof(e));}struct pnwdis{    int pn,dist;    friend bool operator<(pnwdis a,pnwdis b)    {        return a.dist>b.dist;    }};int dis[maxv];void dijstra(int st){    bool settled[maxv];    priority_queue<pnwdis> Q;    memset(settled,0,sizeof(settled));    while(!Q.empty()) Q.pop();    for(int i=1;i<=N;i++) dis[i]=inf;    dis[st]=0;    pnwdis stt;    stt.pn=st; stt.dist=0;    Q.push(stt);    while(!Q.empty())    {        pnwdis t=Q.top();        Q.pop();        if(settled[t.pn]) continue;        settled[t.pn]=1;        for(int i=head[t.pn];i!=-1;i=e[i].next)        {            int to=e[i].d;            int mid=t.pn;            if(!settled[to])            {                if(dis[to]>dis[mid]+e[i].w)                {                    dis[to]=dis[mid]+e[i].w;                    pnwdis tt;                    tt.pn=to;                    tt.dist=dis[to];                    Q.push(tt);                }            }        }    }}void print(){    for(int i=1;i<=N;i++)    {        printf("%d ",dis[i]);    }    printf("\n");}int main(){    int T;    scanf("%d",&T);    while(T--)    {        ll ans=0;        scanf("%d%d",&N,&M);        which=1;        initforgraph();        int t1,t2,t3;        for(int i=1;i<=M;i++)        {            scanf("%d%d%d",&t1,&t2,&t3);            restore[i][0]=t1;            restore[i][1]=t2;            restore[i][2]=t3;            add(t1,t2,t3);        }        dijstra(1);        for(int i=1;i<=N;i++)            ans+=dis[i];        initforgraph();        which=1;        for(int i=1;i<=M;i++)        {            add(restore[i][1],restore[i][0],restore[i][2]);        }        dijstra(1);        for(int i=1;i<=N;i++)            ans+=dis[i];        cout<<ans<<endl;    }}
代码有点长……不好意思水平有限……

原创粉丝点击