题目:

Roadblocks
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 7075 Accepted: 2629
Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too quickly, because she likes the scenery along the way. She has decided to take the second-shortest rather than the shortest path. She knows there must be some second-shortest path. The countryside consists of R (1 ≤ R ≤ 100,000) bidirectional roads, each linking two of the N (1 ≤ N ≤ 5000) intersections, conveniently numbered 1..N. Bessie starts at intersection 1, and her friend (the destination) is at intersection N. The second-shortest path may share roads with any of the shortest paths, and it may backtrack i.e., use the same road or intersection more than once. The second-shortest path is the shortest path whose length is longer than the shortest path(s) (i.e., if two or more shortest paths exist, the second-shortest path is the one whose length is longer than those but no longer than any other path). Input Line 1: Two space-separated integers: N and R
Lines 2..R+1: Each line contains three space-separated integers: A, B, and D that describe a road that connects intersections A and B and has length D (1 ≤ D ≤ 5000)
Output Line 1: The length of the second shortest path between node 1 and node N
Sample Input 4 4
1 2 100
2 4 200
2 3 250
3 4 100
Sample Output 450
Hint Two routes: 1 -> 2 -> 4 (length 100+200=300) and 1 -> 2 -> 3 -> 4 (length 100+250+100=450)

题目

题意:无向图。 起点为1, 终点为 n, 输出仅次于 最短路的次短路, 路径可重复走。

思路:正反求两遍最短路,得出1 到所有点的最短距离, 和 n到所有点的最短距离。因为路径可以重复走,所以两点之间只有一条边的可以重复经过。接着将每条边视作单项边,枚举每条单项边e(u, v),Dist = dist(1, u) + dist(n, v) + dist(u,v).这样只会重复一条最小边。所求得的 大于 dist(1, n)的最小的Dist,就是题目的解。(理解不了的画一下图就明白了)

AC代码:

 #include<cstdio>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstring>
#include<climits>
using namespace std;
#define maxn 100009
#define INF INT_MAX-100000
struct Edge
{
int from, to, dist;
}; struct Heapnode
{
int d, u;
bool operator < (const Heapnode& that) const {
return d > that.d;
}
}; int dist1[maxn], dist2[maxn];
struct Dijkstra
{
int n, m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];
int d[maxn];
int p[maxn]; void init(int n) {
this->n = n;
for(int i = ; i < n; i++) G[i].clear();
edges.clear();
} void AddEdge(int from, int to , int dist) {
edges.push_back((Edge) {from, to , dist});
m = edges.size();
G[from].push_back(m-);
} void dijkstra(int s, int* dx) {
priority_queue<Heapnode> Q;
for(int i = ; i < n; i++) dx[i] = d[i] = INF;
d[s] = dx[s] = ;
memset(done, , sizeof(done));
Q.push((Heapnode) {, s});
while(!Q.empty()) {
Heapnode x = Q.top(); Q.pop();
int u = x.u;
if(done[u]) continue;
done[u] = true;
int size = G[u].size();
for(int i = ; i < size; i++) {
Edge& e = edges[G[u][i]];
if(d[e.to] > d[u] + e.dist) {
dx[e.to] = d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
Q.push ((Heapnode) {d[e.to], e.to});
}
}
}
}
}dij; void work(int n, int r)
{
dij.init(n+);
for(int i = ; i < r; i++){
int a, b, c; scanf("%d%d%d", &a, &b, &c);
dij.AddEdge(a, b, c);
dij.AddEdge(b, a, c);
}
dij.dijkstra(, dist1);
dij.dijkstra(n, dist2);
int Dist, sta = dist1[n], res = INF;
for(int i = ; i <= n; i++){
int ss = dij.G[i].size();
for(int j = ; j < ss; j++){
int m = dij.G[i][j];
Edge ee = dij.edges[m];
Dist = dist1[ee.from] + dist2[ee.to] + ee.dist;
if(Dist < res && Dist > dist1[n]) res = Dist;
//cout<<Dist<<" "<<res<<endl;
}
}
printf("%d\n", res);
}
int main()
{
int n, r;
while(scanf("%d%d", &n, &r) != EOF){
work(n, r);
}
return ;
}

poj-3255-Roadblocks-路径可重复次短路的更多相关文章

  1. POJ 3255 Roadblocks(A*求次短路)

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12167   Accepted: 4300 Descr ...

  2. POJ 3255 Roadblocks (次级短路问题)

    解决方案有许多美丽的地方.让我们跳回到到达终点跳回(例如有两点)....无论如何,这不是最短路,但它并不重要.算法能给出正确的结果 思考:而最短的路到同一点例程.spfa先正达恳求一次,求的最短路径的 ...

  3. poj 3255 Roadblocks 次短路(两次dijksta)

    Roadblocks Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total S ...

  4. POJ 3255 Roadblocks (次短路模板)

    Roadblocks http://poj.org/problem?id=3255 Time Limit: 2000MS   Memory Limit: 65536K       Descriptio ...

  5. POJ 3255 Roadblocks --次短路径

    由于次短路一定存在,则可知次短路一定是最短路中某一条边不走,然后回到最短路,而且只是一条边,两条边以上不走的话,就一定不会是次短路了(即以边换边才能使最小).所以可以枚举每一条边,算出从起点到这条边起 ...

  6. POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16425   Accepted: 5797 Descr ...

  7. POJ 3255 Roadblocks (次短路 SPFA )

    题目链接 Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her ...

  8. POJ 3255 Roadblocks (次短路)

    题意:给定一个图,求一条1-n的次短路. 析:次短路就是最短路再长一点呗,我们可以和求最短路一样,再多维护一个数组,来记录次短路. 代码如下: #pragma comment(linker, &quo ...

  9. 次最短路径 POJ 3255 Roadblocks

    http://poj.org/problem?id=3255 这道题还是有点难度 要对最短路径的算法非常的了解 明晰 那么做适当的修改 就可以 关键之处 次短的路径: 设u 到 v的边权重为cost ...

  10. poj 3255 Roadblocks

    Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13216 Accepted: 4660 Descripti ...

随机推荐

  1. Codeforces Round #254 (Div. 1) C. DZY Loves Colors 线段树

    题目链接: http://codeforces.com/problemset/problem/444/C J. DZY Loves Colors time limit per test:2 secon ...

  2. BZOJ 4500: 矩阵 差分约束

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4500 题解: 从行向列建边,代表一个格子a[i][j],对每个顶点的所有操作可以合并在一 ...

  3. 4554: [Tjoi2016&Heoi2016]游戏 二分图匹配

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4554 题解: 如果没有硬石头的话,就是’*‘点对应的行列建边,然后跑最大匹配 硬石头什么 ...

  4. bzoj 1028 暴力枚举判断

    昨天梦到这道题了,所以一定要A掉(其实梦到了3道,有两道记不清了) 暴力枚举等的是哪张牌,将是哪张牌,然后贪心的判断就行了. 对于一个状态判断是否为胡牌,1-n扫一遍,然后对于每个牌,先mod 3, ...

  5. Matlab画柱状和折线对照图

        上面是效果图,看着很不错吧,主要的问题在于用XTickLabel设置横坐标时候,横坐标会扩展,就是说如果label是[1 2 3],咱就做了三组试验,参数分别是 1 2 3,但是显示是1 2 ...

  6. javascript实现数据结构与算法系列:功能完整的线性链表

    由于链表在空间的合理利用上和插入,删除时不需要移动等的有点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表长度时不如顺序存储结构的缺点:另一方面,由于在链表中 ...

  7. Linux性能检测命令 - vmstat

    一.vmstat命令描述 最常见的Linux/Unix监控工具想必是vmstat了,vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可以展现给定时间间隔的服务 ...

  8. POJ3164 Command Network(最小树形图)

    图论填个小坑.以前就一直在想,无向图有最小生成树,那么有向图是不是也有最小生成树呢,想不到还真的有,叫做最小树形图,网上的介绍有很多,感觉下面这个博客介绍的靠谱点: http://www.cnblog ...

  9. Android中的SQLite使用学习

    Android中的SQLite使用学习 SQLite是非常流行的嵌入式关系型数据库,轻载, 速度快,而且是开源.在Android中,runtime提供SQLite,所以我们可以使用SQLite,而且是 ...

  10. java 格式化代码 不进行换行

    此处无声胜有声.