poj 3255 Roadblocks
Roadblocks
|
Time Limit: 2000MS |
Memory Limit: 65536K |
|
|
Total Submissions: 13216 |
Accepted: 4660 |
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 intersectionN.
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)
Source
题意:
给出n个点,m条双向边,求严格次短路。
AC代码:
#include<cstdio>
#include<cstring>
#include<queue>
#define R register
using namespace std;
inline int read(){
R int x=;bool f=;
R char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
}
const int N=1e5+;
struct node{
int u,v,w,next;
}e[N<<];
int n,m,tot,head[N],dis1[N],dis2[N];
bool vis[N];
void add(int x,int y,int z){
e[++tot].u=x;
e[tot].v=y;
e[tot].w=z;
e[tot].next=head[x];
head[x]=tot;
}
void spfa1(int S){
queue<int>q;
memset(vis,,sizeof vis);
memset(dis1,/,sizeof dis1);
q.push(S);
dis1[S]=;vis[S]=;
while(!q.empty()){
int x=q.front();q.pop();
vis[x]=;
for(int i=head[x];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(dis1[v]>dis1[x]+w){
dis1[v]=dis1[x]+w;
if(!vis[v]){
vis[v]=;
q.push(v);
}
}
}
}
}
void spfa2(int S){
queue<int>q;
memset(vis,,sizeof vis);
memset(dis2,/,sizeof dis2);
q.push(S);
dis2[S]=;vis[S]=;
while(!q.empty()){
int x=q.front();q.pop();
vis[x]=;
for(int i=head[x];i;i=e[i].next){
int v=e[i].v,w=e[i].w;
if(dis2[v]>dis2[x]+w){
dis2[v]=dis2[x]+w;
if(!vis[v]){
vis[v]=;
q.push(v);
}
}
}
}
}
void Cl(){
tot=;
memset(e,,sizeof e);
memset(head,,sizeof head);
}
void work(){
Cl();
for(int i=,x,y,z;i<=m;i++){
x=read();y=read();z=read();
add(x,y,z);
add(y,x,z);
}
spfa1();
spfa2(n);
int shortest=dis1[n],shorter=0x7fffffff;
for(int i=;i<=m*;i++){
int len=dis1[e[i].u]+dis2[e[i].v]+e[i].w;
if(len>shortest&&len<shorter) shorter=len;
}
printf("%d\n",shorter);
}
int main(){
while(scanf("%d%d",&n,&m)==) work();
return ;
}
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 (次短路模板)
Roadblocks http://poj.org/problem?id=3255 Time Limit: 2000MS Memory Limit: 65536K Descriptio ...
- 次最短路径 POJ 3255 Roadblocks
http://poj.org/problem?id=3255 这道题还是有点难度 要对最短路径的算法非常的了解 明晰 那么做适当的修改 就可以 关键之处 次短的路径: 设u 到 v的边权重为cost ...
- poj 3255 Roadblocks 次短路(两次dijksta)
Roadblocks Time Limit : 4000/2000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total S ...
- POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16425 Accepted: 5797 Descr ...
- 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 ...
随机推荐
- 安卓开发基础之tween动画基本使用,代码教学
xml代码块: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro ...
- org.apache packages can't be resolved in Eclipse解决方案
删除.m2仓库里面对应的jar包,重新Maven->update project
- Photo Shop切图
切图之前 哪些是需要切出来的? 修饰性的 (一般用在background属性) 图标.logo 有特殊效果的按钮 文字等 非纯色的背景 内容性的 (一般用在img标签) Banner.广告图片 文章 ...
- IT行业常见职位职业路线图
我曾经面试过一些计算机相关毕业的应届生,问他希望做什么工作时,他回答只要是软件开发就好了,再细问一下你了解到的软件开发是怎样的?除了软件开发,还有其它什么工作?就答不出来了. 这里我先给出一张IT知识 ...
- 史上最详细“截图”搭建Hexo博客——For Windows
http://angelen.me/2015/01/23/2015-01-23-%E5%8F%B2%E4%B8%8A%E6%9C%80%E8%AF%A6%E7%BB%86%E2%80%9C%E6%88 ...
- 关于rails里集成测试assert_template的写法
assert_template后面只能跟随模板文件名,不能跟随命名路径.比如routes.rb: get 'login' => 'sessions#new' 在集成测试用例里,只能写成asser ...
- WPF学习之路(二) XAML(续)
属性 简单属性 前面用到的Width/Height都是简单属性,其赋值一定要放到双引号里 XAML解析器会根据属性的类型执行隐式转换 与C#的区别 SolidBrush.Color = Colors. ...
- 安卓+servlet+MySql 查询+插入(汉字乱码解决)
问题: 安卓程序,通过servlet连接MySQL数据库,并实现查询和插入(修改,删除类似). 其中遇到的最大的问题是:汉字乱码问题(查询条件有汉字乱码.servlet的汉字到数据乱码.安卓通过ser ...
- Maven基础使用
常用命令 mvn clean:清除maven的编译结果 mvn compile:编译 mvn package:编译.打包 mvn install:编译.打包.部署 –DskipTests:编译测试用例 ...
- CentOS 6.3下MySQL 5.6源码安装
Linux操作系统:CentOS 6.3 1:下载:当前mysql版本到了5.6.10 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downl ...