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;
}
原文地址:https://www.cnblogs.com/CzYoL/p/7814625.html