BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路 Dijkstra
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的第二短路的长度
我们有一个猜想:
依次枚举每一条边,将该边的边权加上起点到该边一点的距离与另一点到终点的最短距离.
依次这样枚举每一条边,比最短路大且最短的一定是第二短路.
Code:
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1000000
#define inf 0x7f7f7f7f
using namespace std;
int cnt,s;
int hd[maxn],to[maxn],nex[maxn],val[maxn],d[maxn],vis[maxn],f[maxn],g[maxn];
void add(int u,int v,int c){
nex[++cnt]=hd[u],hd[u]=cnt,to[cnt]=v,val[cnt]=c;
}
struct Edge{
int u,v,c;
Edge(int u=0,int v=0,int c=0):u(u),v(v),c(c){}
}edges[maxn];
struct Node{
int u,dis;
Node(int u=0,int dis=0):u(u),dis(dis){}
bool operator<(Node b)const{
return dis>b.dis;
}
};
priority_queue<Node>Q;
void dijkstra(){
memset(vis,0,sizeof(vis));
for(int i=0;i<maxn;++i) d[i]=inf;
d[0]=d[s]=0;
Q.push(Node(s,d[s]));
while(!Q.empty()){
Node e=Q.top();Q.pop();
if(vis[e.u]) continue;
vis[e.u]=1;
int u=e.u;
for(int i=hd[u];i;i=nex[i]){
if(d[to[i]]>d[u]+val[i]){
d[to[i]]=d[u]+val[i];
Q.push(Node(to[i],d[to[i]]));
}
}
}
}
int main(){
// setIO("input");
int n,m,tot=0,ans=inf,tmp;
scanf("%d%d",&n,&m);
for(int i=1,a,b,c;i<=m;++i) {
scanf("%d%d%d",&a,&b,&c),add(a,b,c),add(b,a,c);
edges[++tot]=Edge(a,b,c),edges[++tot]=Edge(b,a,c);
}
s=1, dijkstra(),tmp=d[n];
for(int i=1;i<=n;++i) f[i]=d[i];
s=n, dijkstra();
for(int i=1;i<=n;++i) g[i]=d[i];
for(int i=1;i<=tot;++i) {
Edge e=edges[i];
if(f[e.u]+val[i]+g[e.v]<ans&&f[e.u]+val[i]+g[e.v]>tmp)
ans=f[e.u]+val[i]+g[e.v];
}
printf("%d\n",ans);
return 0;
}
BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路 Dijkstra的更多相关文章
- Bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路 dijkstra,堆,A*,次短路
1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 969 Solved: 468[S ...
- BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路( 最短路 )
从起点和终点各跑一次最短路 , 然后枚举每一条边 , 更新answer ---------------------------------------------------------------- ...
- BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路
1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...
- BZOJ 1726 [Usaco2006 Nov]Roadblocks第二短路:双向spfa【次短路】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1726 题意: 给你一个无向图,求次短路. 题解: 两种方法. 方法一: 一遍spfa,在s ...
- bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路【dijskstra】
严格次短路模板,用两个数组分别维护最短路和次短路,用dijskstra,每次更新的时候先更新最短路再更新次短路 写了spfa版的不知道为啥不对-- #include<iostream> # ...
- 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第二短路
[算法]最短路(spfa) 次短路 [题解] 正反跑两次SPFA,然后枚举每一条边,如果起点到一个端点的最短路+另一个端点到终点的最短路+长度 ≠ 最短路,则和答案比较,保存最小值. #include ...
- 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的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...
随机推荐
- 支付宝h5支付从支付到退款
先说明,支付是之前写好的,调用的是支付宝旧的即时到账接口,所也没有去集成应用,退款调用的是无密即时到账退款接口!!! https://doc.open.alipay.com/支付宝文档资料,蚂蚁金服开 ...
- lucene_03_索引的增删改查
lucene索引的添加见 http://www.cnblogs.com/getchen/p/8615276.html 入门代码. 公共代码 public <T extends Query> ...
- dubbo-刷一遍用户指南(三)
想更好的使用dubbo,最好刷几遍用户指南,dubbo用户指南几乎包含了所有dubbo所有的特性 用户指南地址:https://dubbo.gitbooks.io/dubbo-user-book/de ...
- mysql use index () 优化查询的例子
USE INDEX在你查询语句中表名的后面,添加 USE INDEX 来提供你希望 MySQ 去参考的索引列表,就可以让 MySQL 不再考虑其他可用的索引.Eg:SELECT * FROM myta ...
- Bi-shoe and Phi-shoe 欧拉函数 素数
Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popular co ...
- JQuery学习(5-AJAX1)
<? php /* * 保护AJAX请求的方式 */ /* * 1. 防止表单的自己主动提交 * 对表单的submit提交进行控制. 设置一个全局变量submitError,在进行验证的方法体中 ...
- linux 文件操作系统调用
crate:创建文件 open:打开文件 read:读取文件 write:写文件 lseek :设置文件偏移量 access:推断文件 close:关闭文件的读写操作
- Python3 pymysql连接MySQL数据库
#!/usr/bin/python # -*- coding:utf8 -*- import pymysql #取得数据库连接对象 conn = pymysql.connect(host='127.0 ...
- UVa 10297 - Beavergnaw
题目:假设一个底边与高为D的圆柱切去一部分使得.剩下的中心是底边与高为d的圆柱. 和以他们底面为上下地面的圆锥台,已知切去的体积,求d. 分析:二分,计算几何.圆锥台体积公式:π*(r^2+r*R+R ...
- linux命令用来查看日志关键字
1.查看日志 前 n行: cat 文件名 | head -n 数量 demo: cat test.log | head -n 200 # 查看test.log前200行 2.查看日志 尾 n行: c ...