次短路

来源:互联网 发布:nginx 转发真实ip 编辑:程序博客网 时间:2024/04/29 04:32

模板题:http://poj.org/problem?id=3255

和用堆实现的Dijkstra差不多

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<map>#include<vector>#define maxn 5005using namespace std;typedef pair<int, int> P;const int inf = 1000000000;int n, m;bool vis[maxn];int d[maxn][2];struct edge{    int to;    int cost;};vector<edge> M[maxn];void dijkstra(int s = 1){        for(int i = 1; i <= n; i++)        {            d[i][0] = d[i][1] = inf;            vis[i] = 0;        }        d[s][0] = 0;        priority_queue<P, vector<P>, greater<P>> PQ;        PQ.push(make_pair(0, s));        while(!PQ.empty())        {            P cur = PQ.top(); PQ.pop();            int v = cur.second;            int dis = cur.first;            if(d[v][1] < dis) continue;            for(int i = 0; i < M[v].size(); i++)            {                edge e = M[v][i];                int u = e.to;                int cost = e.cost + dis;                if(d[u][0] > cost)                {                   swap(d[u][0], cost);                    PQ.push(make_pair(d[u][0], u));                }                if(d[u][1] > cost && d[u][0] < cost)                {                    d[u][1] = cost;                    PQ.push(make_pair(d[u][1], u));                }            }        }        cout << d[n][1] << endl;}int main(){        cin >> n >> m;        for(int i = 0; i < maxn; i++)            M[i].clear();        for(int i = 0; i < 2 * m; i += 2)        {            int u, v, c;            scanf("%d%d%d", &u, &v, &c);            edge tmp;            tmp.to = v;            tmp.cost = c;            M[u].push_back(tmp);            tmp.to = u;            tmp.cost = c;            M[v].push_back(tmp);        }        dijkstra();    return 0;}


原创粉丝点击