POJ 3255 Roadblocks(次短路模板題)
阿新 • • 發佈:2018-12-29
http://poj.org/problem?id=3255
寫了還算多的最短路題目發現,沒寫過次短路。順著挑戰刷,就看到了次短路,然後發現一臉懵逼。
其實理解了後發現超級簡單。次短路,每個點都記錄兩個距離就好了,最短的和次短的。然後最後輸出第n個點的次短的即可。
程式碼如下:
#include<iostream> #include<vector> #include<utility> #include<queue> #include<cstdio> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 5005; typedef pair<int, int> pii; int dis[maxn], dis_2[maxn]; struct node{ int p, val; node(){} node(int a, int b){ p = a; val = b; } }; vector <node> edge[maxn]; inline void add_edge(int u, int v, int val){ edge[u].push_back(node(v, val)); edge[v].push_back(node(u, val)); } void dijkstra(int s){ fill(dis, dis + maxn, INF); fill(dis_2, dis_2 + maxn, INF); priority_queue<pii, vector<pii>, greater<pii> >q; q.push(make_pair(0, s)); dis[s] = 0; while(!q.empty()){ pii now = q.top(); q.pop(); if(now.first > dis_2[now.second]) continue; for(int i = 0; i < edge[now.second].size(); i++){ node next = edge[now.second][i]; int d = now.first + next.val; if(dis[next.p] > d) { swap(dis[next.p], d); q.push(make_pair(dis[next.p], next.p)); } if(dis[next.p] < d && dis_2[next.p] > d) { dis_2[next.p] = d; q.push(make_pair(d, next.p)); } } } } int main(){ int n, r, u, v, val; cin >> n >> r; while(r--){ scanf("%d%d%d", &u, &v, &val); add_edge(u, v, val); } dijkstra(1); cout << dis_2[n] << endl; return 0; }