2407: 探险

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 170  Solved: 95
[Submit][Status][Discuss]

Description

探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过!
比赛即将开始,工作人员说明了这次比赛的规则:每个溶洞和其他某些溶洞有暗道相连。两个溶洞之间可能有多条道路,也有可能没有,但没有一条暗道直接从自己连到自己。参赛者需要统一从一个大溶洞出发,并再次回到这个大溶洞。
如果就这么点限制,那么问题就太简单了,可是举办方又提出了一个条件:不能经过同一条暗道两次。这个条件让大家犯难了。这该怎么办呢?
到了大溶洞口后,小T愉悦地发现这个地方他曾经来过,他还记得有哪些暗道,以及通过每条暗道的时间。小T现在向你求助,你能帮他算出至少要多少时间才能回到大溶洞吗?

Input

第一行两个数n,m表示溶洞的数量以及暗道的数量。

接下来m行,每行4个数s、t、w、v,表示一个暗道连接的两个溶洞s、t,这条暗道正着走(s à t)的所需要的时间w,倒着走(t à s)所需要的时间v。由于溶洞的相对位置不同,wv可能不同。

Output

输出一行一个数t,表示最少所需要的时间。

Sample Input

3 3
1 2 2 1
2 3 4 5
3 1 3 2

Sample Output

8

HINT

N<=10000,M<=200000,1<=W,V<=10000

双倍经验啊(福慧双修数据范围大一点)

这两道题都是rank1 还比rank2快好多 哈哈哈哈

题解看黄学长的吧

#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<bitset>
#include<queue>
#include<set>
#include<map>
using namespace std;typedef long long ll;inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}
void print(ll x)
{if(x<0)x=-x,putchar('-');if(x>=10)print(x/10);putchar(x%10+'0');}const int N=10100,M=400100,inf=0X3f3f3f3f;int n,m,T;int ecnt,last[N];
struct EDGE{int to,nt,val;}e[M];
inline void add(int u,int v,int val)
{e[++ecnt]=(EDGE){v,last[u],val};last[u]=ecnt;}int U[M],V[M],VAL[M],tot;inline void insert(int u,int v,int val)
{U[++tot]=u;V[tot]=v;VAL[tot]=val;}struct node{int pos,dis;friend bool operator <(const node &x,const node &y){return x.dis>y.dis;}};bool vis[N];int dis[N],p[N];priority_queue<node>q;void dijkstra()
{memset(vis,0,sizeof(vis));memset(dis,0X3f,sizeof(dis));q.push((node){1,0});dis[1]=0;register int u,i;while(!q.empty()){u=q.top().pos;q.pop();if(vis[u])continue;vis[u]=1;for(i=last[u];i;i=e[i].nt)if(dis[e[i].to]>dis[u]+e[i].val){dis[e[i].to]=dis[u]+e[i].val;u==1?p[e[i].to]=e[i].to:p[e[i].to]=p[u];if(!vis[e[i].to])q.push((node){e[i].to,dis[e[i].to]});}}
}void rebuild()
{register int u,i;for(u=1;u<=n;++u)for(i=last[u];i;i=e[i].nt){if(e[i].to==1) {p[u]^u?insert(1,T,dis[u]+e[i].val):insert(u,T,e[i].val);continue;}if(u==1) {if(p[e[i].to]^e[i].to)insert(1,e[i].to,e[i].val);continue;}p[u]^p[e[i].to]?insert(1,e[i].to,dis[u]+e[i].val):insert(u,e[i].to,e[i].val);}ecnt=0;memset(last,0,sizeof(last));for(i=1;i<=tot;++i)add(U[i],V[i],VAL[i]);
}int main()
{n=read();m=read();T=n+1;register int i,u,v,val1,val2;for(i=1;i<=m;++i){u=read();v=read();val1=read();val2=read();add(u,v,val1);add(v,u,val2);}dijkstra();rebuild();dijkstra();if(dis[T]==inf){puts("-1");return 0;}print(dis[T]);puts("");return 0;
}
/*
3 3
1 2 2 1
2 3 4 5
3 1 3 28
*/

BZOJ 2407: 探险/BZOJ 4398: 福慧双修 dijkstra 构造相关推荐

  1. BZOJ 2407: 探险/4398: 福慧双修

    2407: 探险 Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明 ...

  2. bzoj 4398: 福慧双修(最短路建模/构造)

    简述题意: 给定一个有向图,对于连接同两个点的边算作同一条,问不经过重复边的最小正权环. 保证没有重边(这个是指有向的),没有自环. 算法:最短路+构造 难度:NOIP+ 题解: 有一种暴力的思路,感 ...

  3. bzoj 4398 福慧双修——二进制分组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...

  4. bzoj 4398 福慧双修 —— 二进制分组+多起点最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路 ...

  5. bzoj 4398 福慧双修 题解

    卡了一晚上啊 首先我们要跑一边整张图的spfa,记录每个点是从哪条边出去的(pre数组) 这里记录的不是前驱边,而是和原点相连的第一个点编号,因为不能走重复边所以才要记录这个,以免刚刚出去又原路返回 ...

  6. 【技巧 二进制分组】bzoj4398: 福慧双修2407: 探险

    二进制分组也可以说是一种比较优美的拆贡献方式吧? Description 菩萨为行,福慧双修,智人得果,不忘其本. --唐朠立<大慈恩寺三藏法师传> 有才而知进退,福慧双修,这才难得. - ...

  7. BZOJ.2069.[POI2004]ZAW(最短路Dijkstra 按位划分)

    题目链接 \(Description\) 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. \(n\leq5000,m\le ...

  8. BZOJ 2069 POI2004 ZAW 堆优化Dijkstra

    题目大意:给定一张无向图,每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路 显然我们需要从点1出发走到某个和点1相邻的点上,然后沿最短路走到另一个和点1相邻 ...

  9. BZOJ 1001 狼抓兔子(Dijkstra)

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

最新文章

  1. java jar包的路径
  2. maven根据profile动态选择配置文件
  3. CG CTF WEB COOKIE
  4. 爬虫技巧:在pycharm 下 调试 scrapy项目
  5. oracle插入未调用并行,oracle并行之概念篇
  6. Spring Session 2.0.0.M1 发布,分布式解决方案
  7. vb中WindowsMediaPlayer的常用属性和方法
  8. java 文件解签加签_将更改的文件移到另一个分支进行签入
  9. GAN里面的Kullback-Leibler Divergence和Jensen–Shannon Divergence
  10. Unicode编码在JavaScript中的作用是什么?
  11. CSDN看不见博主博客的评论_解决办法(亲测有效奥)
  12. python函数调用执行的四个步骤_如何调用python函数
  13. Linux制作U盘Windows启动盘,windows下制作linux U盘启动盘或者安装优盘(转)
  14. PTA-1016——Phone Bills
  15. Set接口以及子集合(HashSet/LinkedHashSet/TreeSet)的用法和数据结构
  16. php两个并排的按钮,如何并排设置2个按钮
  17. 使用jpedal解析PDF到XML
  18. 初级php程序员的自我提升
  19. 3 万字 + 100 张图带你彻底搞懂 TCP 面试题(强烈建议收藏)
  20. 让地震预警更快、更准,人工智能助力城市应急管理

热门文章

  1. 【内部接口】LVGL WIFI配网
  2. 一次真实的入侵-------记对一足球推荐站点的渗透
  3. Ubuntu 16.04 解决钉钉、微信等打开chrome时无法打开链接,只能停留在主页的问题
  4. 文档点击链接无法自动跳转浏览器+google浏览器重启无法继续浏览上次打开的网页
  5. 差分信号经运放后转为单端输出供单片机采集原理图
  6. python人脸识别、语音合成、智能签到系统
  7. 【SpringBoot】springboot日志配置
  8. 学校热水系统服务认证
  9. 解决:Plug-in org.eclipse.wst.jsdt.ui was unable to instantiate class org.eclipse.wst.jsdt.inte
  10. 将123倒转 c语言,中国航信杯C语言程序设计答案解析版.doc