POJ 3255(次短路)
2018-02-07 16:29
169 查看
《挑战程序设计竞赛》,初级篇–图
// Dijkstra 次短路 #include <iostream> #include <cstdio> #include <vector> #include <queue> using namespace std; #define maxv 5050 #define maxe 1e5+10 #define INF 9999 struct edge { int to; int cost; }; // first是最短距离,second是顶点的编号 typedef pair<int, int> P; int N,R; vector<edge> G[maxv]; // 邻接表 int dist[maxv]; // 最短路 int dist2[maxv]; // 次短路 void slove() { priority_queue<P, vector<P>, greater<P> > que; fill(dist, dist + N, INF); fill(dist2, dist2 + N, INF); dist[0] = 0; que.push(P(0,0)); while(!que.empty()) { P p = que.top(); que.pop(); int v = p.second, d = p.first; if(dist2[v] < d) continue; for(int i = 0; i < G[v].size(); i++) { edge &e = G[v][i]; int d2 = d + e.cost; if(dist[e.to] > d2) { swap(dist[e.to],d2); que.push(P(dist[e.to],e.to)); } if(dist2[e.to] > d2 && dist[e.to] < d2) { dist2[e.to] = d2; que.push(P(dist2[e.to],e.to)); } } } printf("---------------------\n"); printf("次短路:%d\n",dist2[N-1]); printf("最短路:%d\n",dist[N-1]); } int main() { cin>>N>>R; for(int i = 0; i < R; i++) { edge e; int s; cin>>s>>e.to>>e.cost; s--; e.to--; // 顶点编号输入[1,N],转换为[0,N-1] G[s].push_back(e); swap(s,e.to); G[s].push_back(e); } slove(); return 0; } /* 测试数据: 4 4 1 2 100 2 3 250 2 4 200 3 4 100 */
相关文章推荐
- 【POJ 3255】Roadblocks 【次短路】
- 【POJ】3255 Roadblocks(次短路+spfa)
- POJ - 3255 Roadblocks (次短路)
- POJ 3255 次短路问题+Dijkstra最短路优化问题
- poj 3255 求次短路路径
- POJ3255 - Roadblocks - 次短路(spfa+LLL优化)
- POJ 3255 Wormholes(最短路最负环)
- POJ 3255 Roadblocks 【次短路】
- POJ 3255 图论基础 次短路
- poj 3255 Roadblocks (次短路+dijkstra)
- POJ 3255 Roadblocks (次短路)
- [POJ 3255]Roadblocks[dijkstra][次短路]
- POJ 3255 Roadblocks (次短路问题)
- POJ 3255 Roadblocks(次短路,Dijkstra变形+邻接表存储)
- POJ 3255 Roadblocks 次短路
- poj 3255 次短路问题 Dijkstra 邻接表
- POJ 3255 (次短路)
- POJ 3255 Roadblocks (Dijkstra求次短路)
- poj 3255 Roadblocks Dijkstra求次短路
- POJ 3255 Roadblocks(A*求次短路)