poj3255Roadblocks之dijkstra解法

来源:互联网 发布:广告算法工程师招聘 编辑:程序博客网 时间:2024/05/17 03:24
  • 分析:到某个顶点的v次短路径要么是到u的最短路径+u->v的边,要么是到u的次短路径加上u->v的边.因此,我们可以在dijkstra求最短路径的基础上进行改进,在更新最短路径的过程中,记录并更新次短路径.

/** Filename:    code.cpp* Created:     2017-10-08* Author:       wyl6 *[mail:17744454343@163.com]* Desciption:  Desciption*/#include <cstdio>#include <cstdlib>#include <iostream>#include <stack>#include <queue>#include <algorithm>#include <cstring>#include <string>#include <cmath>#include <vector>#include <bitset>#include <list>#include <sstream>#include <set>#include <functional>using namespace std;#define INF 0x3f3f3f3fint n,r;int d[5005];int d2[5005];struct edge{int to,cost;edge(){}edge(int to,int cost):to(to),cost(cost){};};vector<edge>G[5005];typedef pair<int,int>P;//first距离,second节点priority_queue<P,vector<P>,greater<P>> que;void dijkstra(){    fill(d,d+n,INF);    fill(d2,d2+n,INF);    d[0] = 0;    que.push(P(0,0));    while (!que.empty()){        P q = que.top();        que.pop();        int v = q.second,dist = q.first;        for (int i = 0; i < G[v].size(); i += 1){            edge e = G[v][i];            int dist2 = dist + e.cost;            if (d[e.to] > dist2){           //不是最短路径,将次短路径候选者保存下来                swap(d[e.to],dist2);        //根据最短路径+边得到的次短路径                que.push(P(d[e.to],e.to));            }            if ((dist2 > d[e.to]) && (dist2 < d2[e.to])){                d2[e.to] = dist2;                que.push(P(d2[e.to],e.to));//根据次短路径+边得到的次短路径            }        }    }    cout << d2[n-1] << endl;}int main(int argc, char const* argv[]){    cin >> n >> r;    for (int i = 0; i < r; i += 1){        int a,b,c;        cin >> a >> b >> c;        G[a-1].push_back(edge(b-1,c));//容易出问题的地方,忘了标准化        G[b-1].push_back(edge(a-1,c));    }    dijkstra();    return 0;}