POJ 3255 Roadblocks【次短路】

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#define clr(x)memset(x,0,sizeof(x))
using namespace std;
#define INF 0x1f1f1f1f
struct node
{
    int from,to,next,w;
}e[1000000];
int tot;
int head[5003];
void add(int s,int t,int wi)
{
    e[tot].from=s;
    e[tot].to=t;
    e[tot].next=head[s];
    e[tot].w=wi;
    head[s]=tot++;
}
struct dd
{
    int xu,di;
    bool operator < (dd t)const{
        return t.di<di;
    }
}tt,in;
priority_queue<dd>dis;
void dijkstra(int s,int *d)
{
    int i;
    in.xu=s;
    in.di=0;
    d[s]=0;
    dis.push(in);
    while(!dis.empty())
    {
        tt=dis.top();
        dis.pop();
        for(i=head[tt.xu];i;i=e[i].next)
        {
            in.xu=e[i].to;
            in.di=tt.di+e[i].w;
            if(in.di<d[in.xu])
            {
                d[in.xu]=in.di;
                dis.push(in);
            }
        }
    }
}
int d1[5004],d2[5003];
int main()
{
    int n,m,i,j,a,b,c,mina,minb,tmp,t;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        clr(head);
        tot=1;
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
            add(b,a,c);
        }
        memset(d1,INF,sizeof(d1));
            dijkstra(1,d1);
        memset(d2,INF,sizeof(d2));
            dijkstra(n,d2);
        mina=minb=INF;
            for(i=1;i<tot;i++)
            {
                t=d1[e[i].from]+d2[e[i].to]+e[i].w;
                if(t<mina)
                {
                    tmp=mina;
                    mina=t;
                    t=tmp;
                }
                if(t<minb&&t!=mina)
                   minb=t;
            }
            printf("%d\n",minb);
    }
    return 0;
}

 

题意: 给出一个 有 N 个节点和 M 条边的有向图,求出这幅图的次短路。

分析:先正向求出 1 到每个点的最短距离 d1[i] ,然后反向求出n 到每个点的最短距离d2[i],

        在枚举每一条边 作为次短路径的边

        次短路径存在于 d1[a]+ g[a][b]+d2[b] 中。

 

posted @ 2012-08-06 15:10  'wind  阅读(208)  评论(0编辑  收藏  举报