BZOJ2407/4398:探险/福慧双修(最短路)
Description
Input
第一行两个数n,m表示溶洞的数量以及暗道的数量。
Output
Sample Input
1 2 2 1
2 3 4 5
3 1 3 2
Sample Output
HINT
N<=10000,M<=200000,1<=W,V<=10000
Solution
黄学长的博客讲的挺好的我就不赘述了……毕竟我抄的人家题解
不过黄学长的代码因为存的是前驱点好像有点萎……比如他博客下面那个数据就能叉掉好多人……
稍微改一下改成存前驱边就好了QwQ
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define N (1000009)
using namespace std; struct Edge{int to,next,len;}edge[N];
struct Node
{
int num,dis;
bool operator < (const Node a) const {return dis>a.dis;}
};
int n,m,s[N],t[N],w[N],v[N],U,V,W,l,S=,T=;
int head[N],num_edge,dis[N],pre[N],vis[N];
priority_queue<Node>q; void add(int u,int v,int l)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
edge[num_edge].len=l;
head[u]=num_edge;
} int Low(int x){return min(x,((x-)^)+);} void Dijkstra()
{
memset(vis,false,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
dis[]=; q.push((Node){,});
while (!q.empty())
{
Node x=q.top(); q.pop();
if (vis[x.num]) continue;
vis[x.num]=true;
for (int i=head[x.num]; i; i=edge[i].next)
if (dis[x.num]+edge[i].len<dis[edge[i].to])
{
dis[edge[i].to]=dis[x.num]+edge[i].len;
pre[edge[i].to]=(x.num==)?i:pre[x.num];
q.push((Node){edge[i].to,dis[edge[i].to]});
}
}
} int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=m; ++i)
{
scanf("%d%d%d%d",&s[i],&t[i],&w[i],&v[i]);
add(s[i],t[i],w[i]); add(t[i],s[i],v[i]);
}
Dijkstra();
memset(head,,sizeof(head)); num_edge=;
for (int i=; i<=m; ++i)
for (int j=; j<=; ++j)
{
if (j==) U=s[i],V=t[i],W=w[i];
else U=t[i],V=s[i],W=v[i];
if (V==)
{
if (Low(pre[U])!=Low((i-)*+j)) add(S,T,dis[U]+W);
else add(U,T,W);
}
else if (U==)
{
if (Low(pre[V])!=Low((i-)*+j)) add(,V,W);
}
else
{
if (pre[U]!=pre[V]) add(,V,dis[U]+W);
else add(U,V,W);
}
}
Dijkstra();
printf("%d\n",dis[T]>2e9?-:dis[T]);
}
BZOJ2407/4398:探险/福慧双修(最短路)的更多相关文章
- 【BZOJ2407/4398】探险/福慧双修 最短路建模
[BZOJ2407]探险 Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作 ...
- [bzoj4398] 福慧双修 最短路 二进制分组
---题面--- 题解: 考场上看的这道题,,,当时70分算法打挂了,今天才知道这个也是原题.... 首先,对于不跟1相邻的边,肯定不会经过两次,因为经过两次就回来了,除了增加路径长度之外没有任何意义 ...
- bzoj 4398 福慧双修 —— 二进制分组+多起点最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路 ...
- 福慧双修&探险 BZOJ4398&BZOJ2407
分析: 双倍经验(数据范围不同). 我们考虑,我们必定是从1走一条边到节点i,之后从i到j跑最短路,之后再从j到1走另一条边的情况下,不会重复,并且是答案.那么我们考虑预处理出pre[i]表示从1走到 ...
- [BZOJ4398]福慧双修/[BZOJ2407]探险
题目大意: 给定一个$n(n\leq40000)$个点$m(m\leq100000)$条边的有向图,求从$1$出发回到$1$的不经过重复结点的最短路. 思路: 首先Dijkstra求出从1出发到每个结 ...
- 题解 bzoj 4398福慧双修(二进制分组)
二进制分组,算个小技巧 bzoj 4398福慧双修 给一张图,同一条边不同方向权值不同,一条边只能走一次,求从1号点出发再回到1号点的最短路 一开始没注意一条边只能走一次这个限制,打了个从一号点相邻节 ...
- bzoj 4398 福慧双修——二进制分组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...
- BZOJ_4398_福慧双修&&BZOJ_2407_探险_分治+dij
BZOJ_4398_福慧双修&&BZOJ_2407_探险_分治+dij Description 菩萨为行,福慧双修,智人得果,不忘其本. ——唐朠立<大慈恩寺三藏法师传> ...
- 【技巧 二进制分组】bzoj4398: 福慧双修&&2407: 探险
二进制分组也可以说是一种比较优美的拆贡献方式吧? Description 菩萨为行,福慧双修,智人得果,不忘其本.——唐朠立<大慈恩寺三藏法师传>有才而知进退,福慧双修,这才难得.——乌雅 ...
随机推荐
- 深入理解JavaScript系列(46):代码复用模式(推荐篇)
介绍 本文介绍的四种代码复用模式都是最佳实践,推荐大家在编程的过程中使用. 模式1:原型继承 原型继承是让父对象作为子对象的原型,从而达到继承的目的: function object(o) { fun ...
- Js的小技巧
感谢好友破狼提供的这篇好文章,也感谢写这些知识点的作者们和将他们整理到一起的作者.这是github上的一篇文章,在这里本兽也就只做翻译,由于本兽英语水平和编程能力都不咋地,如有不好的地方也请多理解体谅 ...
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
- [转]weui-wxss WeUI for 小程序 为微信小程序量身设计
本文转自:https://github.com/weui/weui-wxss/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=tou ...
- java gc 随记
gc为garbage collection的缩写,中文翻译为垃圾回收.垃圾为不在使用的实例.变量,回收为释放垃圾所占用的内存空间. 学习过的C语言.C++语言,是没有垃圾回收机制的,因此需要软件工程师 ...
- Expression Blend实例中文教程(2) - 界面快速入门
上一篇主要介绍Expression系列产品,另外概述了Blend的强大功能,本篇将用Blend 3创建一个新Silverlight项目,通过创建的过程,对Blend进行快速入门学习. 在开始使用Ble ...
- (C++学习)关于CString的一些疑问
#include <iostream> #include <string> #include <afx.h> #include <vector> usi ...
- Spring学习笔记:Spring整合Mybatis学习PPT(三:整合思路)
三.Spring-Mybatis的整合思路
- php foreach遍历
foreach($facility_list['data'] as $facility){ //处理语句} 第一种格式遍历给定的 array_expression_r_r 数组.每次循环中,当前单元的 ...
- 从ExtensionLoader理解Dubbo扩展机制
Dubbo的扩展机制是怎么实现的?最简单的回答就是@SPI. Dubbo的插件化思路来源于Java SPI. JAVA SPI 机制 SPI的全名为Service Provider Int ...