【bzoj1726】Roadblocks
1726: [Usaco2006 Nov]Roadblocks第二短路
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 1578 Solved: 795
[Submit][Status][Discuss]
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)
HINT
Source
题意:
求无向图中$1\rightarrow N$的严格次短路长度。
题解:
树上次长链都会维护了,图上次短路怎么能不会……
考虑常用的$Dijkstra$的运行过程,每次从优先队列队首挑一个$dis$最小的点,该点的$dis$就被确定下来(都是正权边一定没有再能更新他的边)。
然后通过该点松弛与之相连的其他点并把它们扔到优先队列中。扔到$N$即可退出。
那么次短路同理,在优先队列中出现的第一个不等于该点最短路的次短路一定是唯一确定的(没有再能更新他的最短路或次短路)。
于是只需要记录该点最短路和次短路是否出现过,并在往优先队列里push的时候标记上这是最短路还是次短路即可。
注意最短路若被更新,次短路要继承最短路的值。
代码:(md我优先队列排序排反还在bzoj上$A$了是什么操作啊)
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue> using namespace std;
#define MAXN 100005
#define MAXM 500005
#define INF 0x7fffffff
#define ll long long struct node{
int u,d,c;
bool operator<(const node b)const{
return d>b.d;
}
};
int hd[MAXN],to[MAXM<<];
int nxt[MAXM<<],cst[MAXM<<];
int N,M,cnt,dis[MAXN][];
bool vis[MAXN][]; inline int read(){
int x=,f=;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-;
for(;isdigit(c);c=getchar())
x=x*+c-'';
return x*f;
} inline void addedge(int u,int v,int w){
to[++cnt]=v,cst[cnt]=w;
nxt[cnt]=hd[u],hd[u]=cnt;
return;
} inline int Dijkstra(int s){
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
priority_queue<node> q;
q.push({,,});
dis[][]=;
while(!q.empty()){
node h=q.top();q.pop();
if(vis[h.u][h.c]) continue;
vis[h.u][h.c]=;
for(int i=hd[h.u];i;i=nxt[i]){
int u=h.u,v=to[i],w=cst[i];
if(dis[v][]>h.d+w){
dis[v][]=dis[v][];
dis[v][]=h.d+w;
q.push(node{v,dis[v][],});
q.push(node{v,dis[v][],});
}
if(dis[v][]>h.d+w && h.d+w!=dis[v][]){
dis[v][]=h.d+w;
q.push(node{v,dis[v][],});
}
}
}
return dis[N][];
} int main(){
N=read(),M=read();
for(int i=;i<=M;i++){
int u=read(),v=read(),w=read();
addedge(u,v,w);addedge(v,u,w);
}
printf("%d\n",Dijkstra());
return ;
}
【bzoj1726】Roadblocks的更多相关文章
- 最短路【bzoj1726】: [Usaco2006 Nov]Roadblocks第二短路
1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...
- 【BZOJ】1726 [Usaco2006 Nov]Roadblocks第二短路
[算法]最短路(spfa) 次短路 [题解] 正反跑两次SPFA,然后枚举每一条边,如果起点到一个端点的最短路+另一个端点到终点的最短路+长度 ≠ 最短路,则和答案比较,保存最小值. #include ...
- 【转】最短路&差分约束题集
转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
随机推荐
- Vue 组件实例属性的使用
前言 因为最近面试了二.三十个人,发现大部分都还是只是停留在 Vue 文档的教程.有部分连教程这部分的文档也没看全.所以稍微写一点,让新上手的 Vuer 多了解 Vue 文档的其他更需要关注的点. 因 ...
- git命令行删除远程分支
先查看远程分支 git branch -r 使用下面两条命令来删除远程分支 git branch -r -d origin/branch-name git push origin :branch-na ...
- java to Json or Json to JavaBean
今天练习,放这里,以后再补充 这里使用的jar包是 net.sf.json.JSONObject package yh.test.t1118; import net.sf.json.JSONArray ...
- LightOJ1138 —— 阶乘末尾0、质因子分解
题目链接:https://vjudge.net/problem/LightOJ-1138 1138 - Trailing Zeroes (III) PDF (English) Statistic ...
- ssh整合 小例子
实现了用户的查插删改操作. 原理:struts负责接收.分发请求.spring采用面向接口编程的思想整合整体框架,负责连接数据库.hibernate负责操作数据库语言. 思路: 1.配置struts的 ...
- CodeForces990G:GCD Counting(树分治+GCD)
You are given a tree consisting of nn vertices. A number is written on each vertex; the number on ve ...
- CQOI2017 部分题解
部分题解是指没写那道算几. BZOJ上目前没有day2的题面D2T2的图. BZOJ4813 小Q的棋盘 显然可以$O(n^2)$DP,然而可以$O(n)$贪心:只有一条从根出发的一条链上的边可以只经 ...
- 当数据库中的字段与javabean中对应的属性名不同
当数据库中的字段与javabean中对应的属性名不同时: 在查询语句中对不同的字段起别名,例如: 数据库中的字段名为last_name , javabean中为lastName则:select las ...
- C++模板之可变模板参数
可变模板参数---- C++11新特性 可变模板参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数 由于可变模 ...
- R文件报错
res中drawable中的资源文件进行命名时只能用0-9或者a-z或者-,其他的东西不能使用,也禁止在重命名时开头使用大写字母