BZOJ1726: [Usaco2006 Nov]Roadblocks第二短路 K短路
Description
贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友。贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路。 贝茜所在的乡村有R(1<=R<=100,000)条双向道路,每条路都联结了所有的N(1<=N<=5000)个农场中的某两个。贝茜居住在农场1,她的朋友们居住在农场N(即贝茜每次旅行的目的地)。 贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且,一条路可以重复走多次。当然咯,第二短路的长度必须严格大于最短路(可能有多条)的长度,但它的长度必须不大于所有除最短路外的路径的长度。
Input
* 第1行: 两个整数,N和R,用空格隔开
* 第2..R+1行: 每行包含三个用空格隔开的整数A、B和D,表示存在一条长度为 D(1 <= D <= 5000)的路连接农场A和农场B
Output
* 第1行: 输出一个整数,即从农场1到农场N的第二短路的长度
Sample Input
1 2 100
2 4 200
2 3 250
3 4 100
Sample Output
输出说明:
最短路:1 -> 2 -> 4 (长度为100+200=300)
第二短路:1 -> 2 -> 3 -> 4 (长度为100+250+100=450)
Solution
k短路..$A*$!
然而我这种不会$A*$的蒟蒻瑟瑟发抖,注意到k很小,所以其实可以跑分层图
在最短路可以更新的时候,把目前的最短路丢给第二短路然后更新
如果不行就看看能不能更新第二段路(注意要判断最短路严格小于目前更新的路程)
最后看看如果上面两步都没法更新能不能用次短路来更新次短路(在目前更新的路径等于最短路时就需要用到这一步)
然后就ok了,当然也可以跑两遍,然后枚举每条边找第二段路
#include <bits/stdc++.h> using namespace std ; #define N 200010
#define inf 0x3f3f3f3f int n , m ;
int d[ N ][ ] , vis[ N ] , q[ N ] ;
// 0最短路 , 1次短路
int head[ N ] , cnt ;
struct node {
int to , nxt , v ;
} e[ N ] ; void ins( int u , int v , int w ) {
e[ ++ cnt ].to = v ;
e[ cnt ].nxt = head[ u ] ;
e[ cnt ].v = w ;
head[ u ] = cnt ;
} void spfa() {
int l = , r = ;
for( int i = ; i <= n ; i ++ ) d[ i ][ ] = d[ ][ ] = inf ;
q[ l ] = ; vis[ ] = ; d[ ][ ] = ;
while( l != r ) {
int u = q[ l ++ ] ;
if( l == ) l = ;
vis[ u ] = ;
for( int i = head[ u ] ; i ; i = e[ i ].nxt ) {
int v = e[ i ].to ;
if( d[ v ][ ] > d[ u ][ ] + e[ i ].v ) {
d[ v ][ ] = d[ v ][ ] ;
d[ v ][ ] = d[ u ][ ] + e[ i ].v ;
if( !vis[ v ] ) {
vis[ v ] = , q[ r ++ ] = v ;
if( r == ) r = ;
}
}
if( d[ v ][ ] < d[ u ][ ] + e[ i ].v && d[ v ][ ] > d[ u ][ ] + e[ i ].v ) {
//严格次短路,所以要判第一个条件
d[ v ][ ] = d[ u ][ ] + e[ i ].v ;
if( !vis[ v ] ) {
vis[ v ] = , q[ r ++ ] = v ;
if( r == ) r = ;
}
}
if( d[ v ][ ] > d[ u ][ ] + e[ i ].v ) {
d[ v ][ ] = d[ u ][ ] + e[ i ].v ;
if( !vis[ v ] ) {
vis[ v ] = , q[ r ++ ] = v ;
if( r == ) r = ;
}
}
}
}
} int main() {
scanf( "%d%d" , &n , &m ) ;
for( int i = , u , v , w ; i <= m ; i ++ ) {
scanf( "%d%d%d" , &u , &v , &w ) ;
ins( u , v , w ) ; ins( v , u , w ) ;
}
spfa() ;
printf( "%d\n" , d[ n ][ ] ) ;
}
BZOJ1726: [Usaco2006 Nov]Roadblocks第二短路 K短路的更多相关文章
- BZOJ1726: [Usaco2006 Nov]Roadblocks第二短路
1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 768 Solved: 369[S ...
- 最短路【bzoj1726】: [Usaco2006 Nov]Roadblocks第二短路
1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...
- Bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路 dijkstra,堆,A*,次短路
1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 969 Solved: 468[S ...
- 1726: [Usaco2006 Nov]Roadblocks第二短路
1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 835 Solved: 398[S ...
- BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路( 最短路 )
从起点和终点各跑一次最短路 , 然后枚举每一条边 , 更新answer ---------------------------------------------------------------- ...
- BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路
1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...
- [Usaco2006 Nov]Roadblocks第二短路
贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的 ...
- bzoj1726:[Usaco2006 Nov]Roadblocks 次短路
Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...
- BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路 Dijkstra
Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...
随机推荐
- 迁移到 Linux :入门介绍 | Linux 中国
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/79001952 这个新文章系列将帮你从其 ...
- Ubuntu14.04+eclipse下cocos2d-x3.0正式版环境的搭建
环境: ubuntu14.04 adt-bundle-linux-x86_64 android-ndk-r9d-linux-x86_64 cocos2d-x-3.0正式版 apache-ant 1.9 ...
- iota 币产生私钥的方法
iota 币的官网是 iota.org, iota 的官网推荐的钱包地址是: https://github.com/iotaledger/wallet iota 币产生私钥是没有什么特殊的要 ...
- 如何实现在H5里调起高德地图APP?
http://www.cnblogs.com/milkmap/p/5912350.html 这一篇文章,将讲述如何在H5里调起高德地图APP,并展示兴趣点.适合于展示某个餐馆,商场等,让用户自行选择前 ...
- AspxGridView点滴
1:页码设置 1>: <SettingsPager Summary-Text="当前第 {0} 页 总共 {1} 页 ({2} 条记录)"></Settin ...
- UVM中的regmodel建模(三)
总结一下UVM中的寄存器访问实现: 后门访问通过add_hdl_path命令来添加寄存器路径,并扩展uvm_reg_backdoor基类,定义read与write函数,最后在uvm_reg_block ...
- 利用<object>和<embed>实现视频播放
直接使用<object>或<embed>都可以实现视频播放,那么两者的区别是什么? 1.是为了兼容不同浏览器,IE只支持对Object的解析:火狐,谷歌,Safari只支持对E ...
- 【week6】团队贡献分
小组名称:nice! 小组成员:李权 于淼 杨柳 刘芳芳 项目内容:约跑app 完成任务: 10% 20% 70% 好 于淼 李权 中 刘芳芳 杨柳 差 1.李权8.4 2.于 ...
- python+Django框架运用(二)
Django应用 与 模板 应用就是网站中的一个独立的程序模块,在Django 中,主目录一般不处理用户的具体请求, 主目录主要做的是项目的初始化和设置,以及请求的分发. 创建应用 1. 创建应用命令 ...
- python webdriver api-读取、设置配置文件
文件结构: db.ini放置db信息的配置文件 文件中[gloryroad]是section信息 下边的dbname等是option信息 UiObjectMap.ini放置访问web的配置信息 配置用 ...