POJ 3255 Roadblocks(次短路)

好久没写图论了,来一发。

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int MAX_N =5000+5;
struct edge
{
    int cost,to;
    edge(int _to,int _cost)
    {
        cost=_cost;
        to=_to;
    }
};
#define oo 100000000
typedef pair<int,int> P;
int dist[MAX_N],dist2[MAX_N];
vector<edge>G[MAX_N];
int N,R;
void slove()
{
    priority_queue<P,vector<P>,greater<P> >que;
    fill(dist,dist+N,oo);
    fill(dist2,dist2+N,oo);
    que.push(P(0,0));
    while(!que.empty())
    {
        P p=que.top();que.pop();
        int v=p.second,d=p.first;
        if(dist2[v]<d) continue;
        for(int i=0; i<G[v].size(); i++)
        {
            edge &e=G[v][i];
            int d2=d+e.cost;
            if(dist[e.to]>d2)///更新最短路
            {
                swap(d2,dist[e.to]);
                que.push(P(dist[e.to],e.to));
            }
            if(dist2[e.to]>d2&&dist[e.to]<d2)///更新次短路
            {
                dist2[e.to]=d2;
                que.push(P(dist2[e.to],e.to));
            }
        }
    }
    printf("%d\n",dist2[N-1]);
    return ;
}
int main()
{
    while(~scanf("%d%d",&N,&R))
    {
        for(int i=0;i<N;i++)
            G[i].clear();
        while(R--)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            a--;b--;
            G[a].push_back(edge(b,c));
            G[b].push_back(edge(a,c));
        }
        slove();
    }
    return 0;
}


你可能感兴趣的:(POJ 3255 Roadblocks(次短路))