POJ 3255 Roadblocks - 次短路
分析:
记录最短值和次短值,每次dijkstra更新。
注意:
- 如果用从que中取出的值更新了最短值,那么就将最短值放入que中。
- 如果用从que中取出的值更新了次短值,那么就将次短值放入que中。
- 从que中取出值后,设取出的最短/次短值为dist,那么在后续更新中写成\(dis[v] = dist + len\)而非\(dis[v] = dis[u] + len.\),因为无法判断是该值u的最短值或次短值(也可以在状态中加入最短和次短的标记。)
code:
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int N = 5005, R = 1e5 + 50, OO = 0x3f3f3f3f;
int n, r, dis[N], dis2[N];
typedef pair<int, int> P;
vector<P> G[N];
bool vst[N];
priority_queue<P, vector<P>, greater<P> > que;
inline void DJ(){
memset(dis, OO, sizeof dis);
memset(dis2, OO, sizeof dis2);
dis[1] = 0;
que.push(P(0, 1));
while(!que.empty()){
P t = que.top(); que.pop();
int u = t.second, dist = t.first;
for(int e = G[u].size() - 1; e >= 0; e--){
int v = G[u][e].first;
if(dis[v] > dist + G[u][e].second){
dis2[v] = dis[v];
dis[v] = dist + G[u][e].second;
que.push(P(dis[v], v));
}
else if(dis2[v] > dist + G[u][e].second){
dis2[v] = dist + G[u][e].second;
que.push(P(dis2[v], v));
}
}
}
}
int main(){
// freopen("h.in", "r", stdin);
scanf("%d%d", &n, &r);
for(int i = 1; i <= r; i++){
int a, b, d; scanf("%d%d%d", &a, &b ,&d);
G[a].push_back(P(b, d));
G[b].push_back(P(a, d));
}
DJ();
printf("%d", dis2[n]);
return 0;
}