次最短路径 POJ 3255 Roadblocks
http://poj.org/problem?id=3255
这道题还是有点难度
要对最短路径的算法非常的了解 明晰 那么做适当的修改 就可以
关键之处 次短的路径: 设u 到 v的边权重为cost
那么到v的次短路径要么是 到u的次短路径+cost;要么是到u的最短路径+cost;
那么就在dijkstra中 既要保存 最短路径的数组 又要 保存次短路径的情况
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#define MAXV 5007
#define MAXE 200007
#define INF 0x3f3f3f3f
//向前星 125ms
using namespace std;
typedef pair<int,int> P; int E, V;
struct Edge
{
int to, cost, next;
Edge () {}
Edge (int to, int cost, int next) : to(to), cost(cost), next(next) {}
}edge[MAXE];
int head[MAXV];
int num = ;
void Add(int from, int to, int cost)
{
edge[num] = Edge(to, cost, head[from]);
head[from] = num++;
} int dijkstra()
{
int dist1[MAXV], dist2[MAXE];
priority_queue<P, vector<P>, greater<P> > que;
fill(dist1, dist1+MAXV, INF);
fill(dist2, dist2+MAXV, INF);
dist1[] = ;
que.push(P(dist1[], ));
while (!que.empty())
{
P p = que.top();
que.pop();
int v = p.second, d = p.first;
if (dist2[v] < d) continue;//如果次短路径都小于d 那么就不用再继续去更新
int t = head[v];
while (t != -)
{
Edge e = edge[t];
int d2 = e.cost + d;//到e.to的假设次短距离 是到v的最距离 + e.cost
if(d2 < dist1[e.to])//如果次短路小于最短路 交换最短路和次短路
{
swap(dist1[e.to], d2);
que.push(P(dist1[e.to], e.to));
}
if (d2 < dist2[e.to] && d2 > dist1[e.to])//如果可以更新次短路
{
dist2[e.to] = d2;
que.push(P(dist2[e.to], e.to));//这两句if 体现次短路 要么是到达其他某个顶点的最短路加上u->v这条边,要么是到u的次短路再加上u->v这条边
}
t = e.next;
}
}
return dist2[V];
} int main()
{
freopen("in.txt", "r", stdin);
scanf("%d%d", &V, &E);
memset(head, -, sizeof(head));
memset(edge, -, sizeof(edge));
for (int i = ; i < E; i++)
{
int from, to, cost;
scanf("%d%d%d", &from, &to, &cost);
Add(from, to, cost);
Add(to, from, cost);
}
int ans = dijkstra();
//cout << ans << endl;
printf("%d\n", ans);
}
次最短路径 POJ 3255 Roadblocks的更多相关文章
- POJ 3255 Roadblocks(A*求次短路)
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12167 Accepted: 4300 Descr ...
- POJ 3255 Roadblocks (次级短路问题)
解决方案有许多美丽的地方.让我们跳回到到达终点跳回(例如有两点)....无论如何,这不是最短路,但它并不重要.算法能给出正确的结果 思考:而最短的路到同一点例程.spfa先正达恳求一次,求的最短路径的 ...
- POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16425 Accepted: 5797 Descr ...
- POJ 3255 Roadblocks (次短路模板)
Roadblocks http://poj.org/problem?id=3255 Time Limit: 2000MS Memory Limit: 65536K Descriptio ...
- poj 3255 Roadblocks
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13216 Accepted: 4660 Descripti ...
- poj 3255 Roadblocks 次短路(两次dijksta)
Roadblocks Time Limit : 4000/2000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total S ...
- POJ 3255 Roadblocks --次短路径
由于次短路一定存在,则可知次短路一定是最短路中某一条边不走,然后回到最短路,而且只是一条边,两条边以上不走的话,就一定不会是次短路了(即以边换边才能使最小).所以可以枚举每一条边,算出从起点到这条边起 ...
- POJ 3255 Roadblocks (次短路 SPFA )
题目链接 Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her ...
- POJ 3255 Roadblocks (次短路)
题意:给定一个图,求一条1-n的次短路. 析:次短路就是最短路再长一点呗,我们可以和求最短路一样,再多维护一个数组,来记录次短路. 代码如下: #pragma comment(linker, &quo ...
随机推荐
- [BZOJ2761][JLOI2011]不重复数字 暴力
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2761 直接暴力. #include<cstdio> #include<c ...
- mysql5.5版本导入sql报错
1 在5.5的版本中不支持utf8_german2的类型 2 在5.5版本中只支持timestamp类型设置默认值为CURRENT_TIMESTAMP,不支持datetime类型默认值设置为CURRE ...
- Es6学习笔记(7)----数组的扩展
参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ 数组的扩展 1.扩展运算符:可以将数组转化成逗号隔离的单个参数...[1,2,3] //控制台运 ...
- appium学习链接记录
乙醇大师的园子: http://www.cnblogs.com/nbkhic/tag/appium/ webDriver java版 https://github.com/easonhan007/we ...
- oss图片上传失败
在生产上跑的正常代码,新搭了个测试环境,发现oss上传失败! 开始分析oss是否有以各种类似于白名单的功能,不认识测试域名导致的...结果不是! 改变访问类型 因为oss节点Endpoint是在杭州, ...
- 修改JRE system library
MyEclipse 默认的情况下JRE system library 是:MyEclipse 的,如何修改工程中的JRE system library呢?步骤如下: 1.选择工程->Proper ...
- c# 移除数组为空元素
通过字符串分割取得的数组中,有的时候可能需要处理除掉数组元素值为空的情况,所以可以按照如下代码完成: string rs="";//需要分割的字符串 char[] chspilt= ...
- vue 组件内 directives指令的调用方式 <base-table v-auto-height:tableHeight="{vm:this, diffHeight:ahTable.diffHeight}"
vue 组件内 directives指令的调用方式 <base-table v-auto-height:tableHeight="{vm:this, diffHeight:ahTabl ...
- hard fault 学习记录
使用 segger 的 hard fault 的源文件后,当调试时,发生硬件错误的时候,可以查看 HardFaultRegs 中的内容,并对比 segger_HardFaultHandler.c 中的 ...
- C和C++中动态链接库的创建和链接(原创,装载请注明原处)
C和C++中动态链接库的创建和链接 1.创建DLL(动态链接库)-C++方式 1.创建DLL(动态链接库-C++方式) 1.在VS(以VS2017为例)中创建DLL动态链接库. 解决方案名称为:MyD ...