poj 3255
来源:互联网 发布:windows phone 升级 编辑:程序博客网 时间:2024/06/06 05:22
题意:从起点到终点,怎样走才是第二小的路径。
参考挑战。
这个题明显的最短路类型。但是又有一点不同,不同的是它是求次短路。次短路,肯定是在最短路的基础上衍生出来的。当最短路可以更新值的时候,那么它摒弃的那一条(原最短路)就可以用来更新次短路。
挑战用的是Dijkstra算法,寻找一点与起点之间的最短路。(当与起点连接时,其路径值才不是inf)
#include<iostream>#include<cstdio>#include<vector>#include<queue>#include<algorithm>using namespace std;const int maxv = 5000 + 5;typedef pair<int, int> P;const int inf = 25000000 + 5;struct node{ int to, cost; node(int x, int y): to(x), cost(y){}};vector<node> G[maxv];int n, r;int dist[maxv];int dist2[maxv];void solve(){ priority_queue<P, vector<P>, greater<P> > que; dist[1] = 0; que.push(P(0, 1)); while(!que.empty()) { P e = que.top(); que.pop(); int d = e.first; int v = e.second; if(d > dist2[v]) continue; for(int i = 0; i < G[v].size(); i++) { int d2 = G[v][i].cost + d; int u = G[v][i].to; if(dist[u] > d2) { swap(dist[u], d2); que.push(P(dist[u], u)); } if(d2 < dist2[u] && dist[u] < d2) { dist2[u] = d2; que.push(P(d2, u)); } } } printf("%d\n", dist2[n]);}int main(){ while(scanf("%d%d", &n, &r) == 2) { fill(dist, dist + n + 1, inf); fill(dist2, dist2 + n + 1, inf); //printf("%d\n", dist2[n]); for(int i = 0; i < r; i++) { int t1, t2, d; scanf("%d%d%d", &t1, &t2, &d); G[t1].push_back(node(t2, d)); G[t2].push_back(node(t1, d)); } solve(); } return 0;}
阅读全文
0 0
- POJ 3255
- poj 3255
- poj 3255
- poj 3255
- POJ 3255
- POJ 3255
- poj 3255
- poj 3255
- poj 3255
- poj 3255
- POJ 3255
- poj 3255
- POJ 3255
- poj 3255 Roadblocks
- poj 3255 Roadblocks
- poj 3255 求次大最短路
- POJ-3255-Roadblocks
- POJ 3255 Roadblocks
- [Android Studio] 向您的项目添加 C 和 C++ 代码
- myeclipse maven项目右键Run As maven install等命令无效
- activeMQ消息队列消息的发送
- Cassandra博文分享
- 11基于opencv的漫水填充算法floodFill()
- poj 3255
- 打印菱形图案——对称和不对称
- Gradle简介和安装和在Eclipse中的使用
- jQuery层级选择器
- 借鉴快速排序的思想,实现算法将整型数组a[0...n]分成两块,使得第一块元素均大于等于0,第二块的元素均小于0,要求算法原地工作且时间复杂度为O(n)
- Java中Class类及用法
- 小程序模态框问题
- Mysql插入数据中文问号或乱码
- java冒泡排序