Description

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

比赛即将开始,工作人员说明了这次比赛的规则:每个溶洞和其他某些溶洞有暗道相连。两个溶洞之间可能有多条道路,也有可能没有,但没有一条暗道直接从自己连到自己。参赛者需要统一从一个大溶洞出发,并再次回到这个大溶洞。

如果就这么点限制,那么问题就太简单了,可是举办方又提出了一个条件:不能经过同一条暗道两次。这个条件让大家犯难了。这该怎么办呢?

到了大溶洞口后,小T愉悦地发现这个地方他曾经来过,他还记得有哪些暗道,以及通过每条暗道的时间。小T现在向你求助,你能帮他算出至少要多少时间才能回到大溶洞吗?

Input

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

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

Output

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

Sample Input

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

Sample Output

8

Data Constraint

对于30%的数据,n<=500,m<=10000
对于60%的数据,n<=2000,m<=50000
对于100%的数据,n<=10000,m<=200000,1<=w,v<=10000

注:3917. 【NOIP2014模拟11.2A组】福慧双修

这题与上面的探险题意完全一样,但"福慧双修"没有重边而"探险"有重边。

题解

恩,我们先看到30%到60%的做法。
然后发现就算是白痴也会打着部分分。
直接上暴力即可。
那么对于100%有3种做法——
一、
我们考虑IDA*。
具体做法就是先在外面二分一个答案值,然后利用IDA*判断可否做。
然后,我们可以每次以1到x号点的距离作为距离标号。
然后剪枝即可(时间复杂度玄学)
当然,能过,然而福慧双修的数据过大,这似乎不够保险。

二、
考虑DP。
我们先在图的右边新建一个节点1’那么就从1开始走。
我们设一个状态f[i,j]表示1第一个到i这个状态,再走到j这个距离1’的状态的最短路。
那么就可以dp了。
当然,这个会超空间。
但是前者显然不用,用一个东西来标记j从哪里来即可。

三、
考虑重构图+dij
你可否听过“关于spfa:他死了”吗?
我们可以先跑一遍dij,求出dist,然后我们还要求出一个prep[i]表示从1出发到i这条最短路径中,连接1第一个出去的点。
假设下面这张图:

那么prep就为:0,2,3,2,3,2,2

既然我们知道了这个prep那么求来试试构建新的图。
枚举所有的边,起点为u,终点为v,边长为z。

  • 1、当u=1,v<>1时

    • 若 prep[v]=v,即说明原点到达点 v 的最短路径即为1→v,故此时不再添加边(dist[v] 已代表该边)
    • 若 prev[v]<>v,说明原点到达点 v 的最短路径不是1→v,此时需要在新图中添加边(1,v,w)
  • 2、当u<>1,v=1时
    • 若 u<>prev[u] 说明从原点到达点 u 的最短路径中没有经过边1→u,即边u→1可以被使用,此时存在一条原点 1→prep[u]→…→u→1的路径
    • 在新图中直接创建一条 1→答案(n+1)长为dist[u]+z的边
    • 若 u=prep[u] 说明到达点 u 的最短路径是由边1→u得到,所以不能通过dist[u]+z的方式返回原点。
    • 但如果存在其他方式到达点 u,则可以通过该边返回,故在新图中创建边u→答案长为z的边。
  • 3、当u<>1,v<>1时
    • 若prep[u]<>prep[v]
    • 建1→v长为dist[u]+z的边(为什么?因为这表示可以由1→u→v→1)
    • 反之建u→v长为z的边(为什么?因为已存在在第一次dij中)

如此看来,再建跑一次dij即可。
但是边会有重复。那么我们可以发现,如果重复的边不是1→x,那么不会影响。
但是1→x重复了,就有锅了。
实际上直接在一开始时特判一下即可。
其实如果运气好,走到顺序不同,也可以过掉。
我就是那种运气好的。

程序

uses math;
varbz:array[1..400000] of boolean;g,dist,wz,d,tov,last,next,v,prep,x,y,z1,z2:array[0..400000] of longint;tov1,last1,next1,v1,x1,y1,z3:array[0..400000] of longint;i,j,k,l,n,m,maxx,t,temp,tot,tot1,now,many:longint;
procedure insert1(x,y,z:longint);
begininc(tot1);tov1[tot1]:=y;next1[tot1]:=last1[x];last1[x]:=tot1;v1[tot1]:=z;
end;
procedure insert(x,y,z:longint);
begininc(tot);tov[tot]:=y;next[tot]:=last[x];last[x]:=tot;v[tot]:=z;
end;
procedure up(x:longint);
vartemp:longint;
beginwhile (x div 2>0) and (dist[d[x]]<dist[d[x div 2]]) dobeginwz[d[x]]:=x div 2;wz[d[x div 2]]:=x;temp:=d[x];d[x]:=d[x div 2];d[x div 2]:=temp;x:=x div 2;end;
end;
procedure down(y:longint);
vartemp,x:longint;
beginx:=1;while ((x*2<=t) and (dist[d[x]]>dist[d[x*2]])) or ((x*2+1<=t) and (dist[d[x]]>dist[d[x*2+1]])) dobeginif (x*2+1<=t) and (dist[d[x*2+1]]<dist[d[x*2]]) thenbeginwz[d[x]]:=x*2+1;wz[d[x*2+1]]:=x;temp:=d[x];d[x]:=d[x*2+1];d[x*2+1]:=temp;x:=x*2+1;endelsebeginwz[d[x]]:=x*2;wz[d[x*2]]:=x;temp:=d[x];d[x]:=d[x*2];d[x*2]:=temp;x:=x*2;end;end;
end;
beginassign(input,'0data.in');reset(input);readln(n,m);for i:=1 to m dobeginreadln(x[i],y[i],z1[i],z2[i]);insert(x[i],y[i],z1[i]);insert(y[i],x[i],z2[i]);inc(many);x1[many]:=x[i];y1[many]:=y[i];z3[many]:=z1[i];inc(many);x1[many]:=y[i];y1[many]:=x[i];z3[many]:=z2[i];end;fillchar(dist,sizeof(dist),127 div 3);maxx:=dist[1];t:=1;dist[1]:=0;bz[1]:=true;wz[1]:=t;d[t]:=1;up(t);while t>0 dobeginbz[d[1]]:=true;i:=last[d[1]];while i>0 dobeginif (bz[tov[i]]=false) and (dist[d[1]]+v[i]<dist[tov[i]]) thenbeginif dist[tov[i]]=maxx thenbegininc(t);dist[tov[i]]:=dist[d[1]]+v[i];wz[tov[i]]:=t;d[t]:=tov[i];if d[1]=1 thenbeginprep[tov[i]]:=tov[i];endelseprep[tov[i]]:=prep[d[1]];up(t);endelsebegindist[tov[i]]:=dist[d[1]]+v[i];prep[tov[i]]:=prep[d[1]];up(wz[tov[i]]);end;end;i:=next[i];end;wz[d[1]]:=0;wz[d[t]]:=1;d[1]:=d[t];dec(t);down(t);end;now:=1;for i:=1 to many dobeginif (x1[i]=1) and (y1[i]<>1) thenbeginif prep[y1[i]]<>y1[i] thenbegininsert1(x1[i],y1[i],z3[i]);end;endelseif (x1[i]<>1) and (y1[i]=1) thenbeginif x1[i]<>prep[x1[i]] thenbegininsert1(1,n+1,dist[x1[i]]+z3[i]);endelsebegininsert1(x1[i],n+1,z3[i]);end;endelseif (x1[i]<>1) and (y1[i]<>1) thenbeginif prep[x1[i]]<>prep[y1[i]] thenbegininsert1(1,y1[i],dist[x1[i]]+z3[i]);endelsebegininsert1(x1[i],y1[i],z3[i]);end;end;end;fillchar(bz,sizeof(bz),0);fillchar(dist,sizeof(dist),127 div 3);fillchar(d,sizeof(d),0);t:=1;dist[1]:=0;bz[1]:=true;wz[1]:=t;d[t]:=1;up(t);while t>0 dobeginbz[d[1]]:=true;i:=last1[d[1]];while i>0 dobeginif (bz[tov1[i]]=false) and (dist[d[1]]+v1[i]<dist[tov1[i]]) thenbeginif dist[tov1[i]]=maxx thenbegininc(t);dist[tov1[i]]:=dist[d[1]]+v1[i];wz[tov1[i]]:=t;d[t]:=tov1[i];up(t);endelsebegindist[tov1[i]]:=dist[d[1]]+v1[i];up(wz[tov1[i]]);end;end;i:=next1[i];end;wz[d[1]]:=0;wz[d[t]]:=1;d[1]:=d[t];dec(t);down(t);end;writeln(dist[n+1]);
end.

jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修相关推荐

  1. 3917 【NOIP2014模拟11.2A组】福慧双修 (Standard IO)题解

    目录 目录 原题 Description Input Output Sample Input Sample Output Data Constraint 题解 40分 100分 模型转换 做法 I I ...

  2. 【NOIP2014模拟11.2A组】福慧双修

    题意 给定一个图,要我们从1号点出发,经过一系列点后重新回到1点,求出最短距离是多少,限制是每条边只能通过一次. 分析 对于这种求最短路径的题,我们一开始当然是想到SPFA,DIJ等一些列的求最短路算 ...

  3. 【NOIP2014模拟11.2B组】超氧化钾

    非常sb的一道题~比赛切掉的我~ Description 作为一个化学小考只有77分的同学,小W感觉很有压力,所以他决定搞化学.今天他开始研究超氧化钾,这是一种很神奇的离子化合物,在高温下空间结构是立 ...

  4. 【NOIP2014模拟11.1B组】吴传之火烧连营(tree)

    题目大意 对于一个序列,多次询问求在 xor K 的情况下最大值. 分析 我们将每一个数拆分成 2 进制,然后映射进一棵 trie 中,然后对于每个询问,根据异或的性质(1 xor 1=0,1 xor ...

  5. 【NOIP2014模拟11.1B组】吴传之火烧连营

    trie,动态开点. 我们可以将输入的a[],b[]全部看成二进制数. 然后按照二进制中的位置从大到小开始建trie. 如果trie不会的可以自己手动普及一下. 建好a[]的trie后,我们可以对于每 ...

  6. 3914. 【NOIP2014模拟11.2B组】人品问题

    Description 网上出现了一种高科技产品--人品测试器.只要你把你的真实姓名输入进去,系统将自动输出你的人品指数.yzx不相信自己的人品为0.经过了许多研究后,yzx得出了一个更为科学的人品计 ...

  7. JZOJ 3912. 【NOIP2014模拟11.2B组】超氧化钾

    Are you ready? 题目: 题意: 分析: 代码: 题目: 传送门 题意: 给定你xxx.yyy,求按照题目给出的z=xz=xz=x modmodmod 1+x1+x1+x modmodmo ...

  8. 3912. 【NOIP2014模拟11.2B组】超氧化钾

    Description 作为一个化学小考只有77分的同学,小W感觉很有压力,所以他决定搞化学.今天他开始研究超氧化钾,这是一种很神奇的离子化合物,在高温下空间结构是立方体,如下图所示.有一天教黄交给了 ...

  9. 【NOIP2014模拟11.2B组】人品问题

    Description 网上出现了一种高科技产品--人品测试器.只要你把你的真实姓名输入进去,系统将自动输出你的人品指数.yzx不相信自己的人品为0.经过了许多研究后,yzx得出了一个更为科学的人品计 ...

最新文章

  1. CV业务落地用Transformer吗?
  2. python一个try块后接一个或多个finally块_Python * with *语句是否完全等同于try-(例外)-finally块?...
  3. Android之error: void value not ignored as it ought to be(In function ‘callMethod2‘)解决办法
  4. Python3.10 结构化模式匹配 PEP 634
  5. Spring学习总结(24)——Spring配置文件加载路径总结
  6. Mathematica颜色系,你喜欢哪一个?
  7. 如何在 Ubuntu 16.10 的 Unity 8 上运行老式 Xorg 程序
  8. Java CopyOnWrite容器
  9. 分享选书原则,推荐几本书(附书评)
  10. python画猫咪老师_简笔画教程:教你画猫咪老师
  11. Blackice.C病毒分析
  12. 什么是芯片加速器 Accelerator
  13. 大型医院his系统源码 医院信息管理系统源码 C/S架构
  14. 计算机打印机图标删除吗,故障之:打印图标消失及打印任务无法取消
  15. java 截取视频_2种方式获取视频时长、截取视频帧作为封面(java or H5)
  16. 苹果8android价格,iphone8plus相当于什么档次的安卓机?从这3方面就可看出
  17. 【codeforces85D】
  18. 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:08 自然语言处理中的机器学习方法
  19. 美国各名校恶搞版的自我介绍
  20. waterfilling之二

热门文章

  1. AcWing 1309. 车的放置 (加法原理、乘法原理、组合数排列数的求法、乘法逆元)
  2. React单页面图片瀑布流——Macy.js
  3. sparksql insertinto 源码解析
  4. 基于STM32单片机的差分升级(增量升级)算法
  5. mongodb集群 java_Mongodb集群操作的JAVA代码详解
  6. 计算机毕业设计springboot交通违章管理系统的设计与实现s7830源码+系统+程序+lw文档+部署
  7. 利用USGS网站下载Landsat系列影像(个人总结的小技巧,适用新手小白)
  8. 今日科技联播:蚂蚁金服回应支付宝法人变更,子弹短信总激活用户超过400万...
  9. python_获取文件及文件夹大小修改时间
  10. 滑动轨迹 曲线 python_Python 模拟真实运动轨迹,轻松完成长跑和打卡