传送门

这什么题啊,乱搞就算了,不知道SPFA已经死了吗 不对那个时候好像还没死

暴力就是删掉边后跑Dijkstra SPFA

然后稍微分析一下,可以发现题目中要求的不经过最短路某条边的路径,一定是先在最短路上走,然后走不是最短路的边,然后走回在最短路上的点走完最短路,因为绕两次肯定不优

所以每次断掉一条边,就从这条边的起点更新最短路,如果走到一个在后面的最短路上的点(如果走到在前面的点,那么到终点会经过断掉的边),就可以丢到堆里,然后每次把堆里不合法的(在前面绕路的)路径删掉,取堆顶就是答案

复杂度\(O(\)玄学\(SPFA)\)

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define db double
  4. #define il inline
  5. #define re register
  6. using namespace std;
  7. const int N=1e5+10;
  8. il int rd()
  9. {
  10. int x=0,w=1;char ch=0;
  11. while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
  12. while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  13. return x*w;
  14. }
  15. int to[N<<1],nt[N<<1],w[N<<1],hd[N],tot;
  16. il void add(int x,int y,int z){++tot,to[tot]=y,nt[tot]=hd[x],w[tot]=z,hd[x]=tot;}
  17. struct node
  18. {
  19. int x,d;
  20. bool operator < (const node &bb) const {return d>bb.d;}
  21. }a[N];
  22. priority_queue<node> hp;
  23. queue<int> q;
  24. bool v[N],vv[N];
  25. int n,m,kk,di[N],e[N],p[N],id[N],d1[N],dn[N];
  26. int st[N],tp;
  27. int main()
  28. {
  29. n=rd(),m=rd(),kk=rd();
  30. for(int i=1;i<=m;++i)
  31. {
  32. int x=rd(),y=rd(),z=rd();
  33. add(x,y,z);
  34. }
  35. p[0]=1;
  36. for(int i=1;i<=kk;++i) e[i]=rd(),p[i]=to[e[i]],id[to[e[i]]]=i;
  37. for(int i=1;i<=kk;++i) d1[i]=d1[i-1]+w[e[i]];
  38. for(int i=kk;i;--i) dn[i-1]=dn[i]+w[e[i]];
  39. memset(di,0x3f3f3f,sizeof(di));
  40. for(int h=0;h<kk;++h)
  41. {
  42. while(tp) vv[st[tp--]]=0;
  43. di[p[h]]=d1[h],v[p[h]]=1,q.push(p[h]);
  44. while(!q.empty())
  45. {
  46. int x=q.front();
  47. q.pop();
  48. for(int i=hd[x];i;i=nt[i])
  49. {
  50. if(i==e[h+1]) continue;
  51. int y=to[i];
  52. if(id[y]&&id[y]>=h)
  53. {
  54. if(!vv[y])
  55. {
  56. vv[y]=1;
  57. st[++tp]=y;
  58. a[y].x=id[y],a[y].d=di[x]+w[i]+dn[id[y]];
  59. }
  60. else a[y].d=min(a[y].d,di[x]+w[i]+dn[id[y]]);
  61. }
  62. else if(di[y]>di[x]+w[i])
  63. {
  64. di[y]=di[x]+w[i];
  65. if(!v[y]) v[y]=1,q.push(y);
  66. }
  67. }
  68. v[x]=0;
  69. }
  70. for(int i=1;i<=tp;++i) hp.push(a[st[i]]);
  71. while(!hp.empty()&&hp.top().x<=h) hp.pop();
  72. printf("%d\n",hp.empty()?-1:hp.top().d);
  73. }
  74. return 0;
  75. }

luogu P3238 [HNOI2014]道路堵塞的更多相关文章

  1. 洛谷 [HNOI2014]道路堵塞 解题报告

    [HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...

  2. 动态删边SPFA: [HNOI2014]道路堵塞

    [HNOI2014]道路堵塞 题目描述 $A$ 国有 $N$座城市,依次标为$1$到$N$.同时,在这$N$座城市间有$M$条单向道路,每条道路的长度是一个正整数.现在,$A$国交通部指定了一条从城市 ...

  3. bzoj 3575: [Hnoi2014]道路堵塞

    Description A 国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径, 并且保证这条路径的长度是所 ...

  4. [HNOI2014]道路堵塞

    题目描述 A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有从城市1到城市N ...

  5. bzoj3575[Hnoi2014]道路堵塞

    http://www.lydsy.com/JudgeOnline/problem.php?id=3575 总赶脚第二题总是比第三题难...... 好吧,这题一点思路都没有 听说用民科可以过掉大部分数据 ...

  6. BZOJ.3575.[HNOI2014]道路堵塞(最短路 动态SPFA)

    题目链接 \(Description\) 给你一张有向图及一条\(1\)到\(n\)的最短路.对这条最短路上的每条边,求删掉这条边后\(1\)到\(n\)的最短路是多少. \(Solution\) 枚 ...

  7. 【BZOJ】3575: [Hnoi2014]道路堵塞

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3575 大概的做法是,按照顺序枚举每一条要删去的边,(假设当前点为$u$,在最短路径上的下一 ...

  8. 【bzoj3575】 Hnoi2014—道路堵塞

    http://www.lydsy.com/JudgeOnline/problem.php?id=3575 (题目链接) 题意 给出一个有向图和一条最短路,问最短路上任意一条边断掉,此时的最短路是多少. ...

  9. 【LG3238】 [HNOI2014]道路堵塞

    题目描述 给你一张\(N\)个点.\(M\)条边的有向图,按顺序给定你一条有\(L\)条边的\(1\rightarrow n\)的最短路, 每次断掉这\(L\)条边中的一条(不对后面答案产生影响),求 ...

随机推荐

  1. WebService学习总结(一)——WebService的相关概念

    一.序言 大家或多或少都听过 WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成 分.但是不得不承认的是W ...

  2. C# Winfrom 发送邮件验证码&Timer控件

    邮件发送: //定义一个全局的string类型的验证码: string yzm = ""; //定义一个字符串,这里面包含所有需要的验证码的元素: string a = " ...

  3. CF698C - LRU

    这又是什么毒瘤..... 解:把操作序列倒着来,就是考虑前k个入队的元素了.显然这样每个元素的概率不变. 状压.设fs表示当前元素为s的概率. 每次转移的时候选择一个不在s中的元素,作为下一个加入的元 ...

  4. 跟我一起用node-express搭建一个小项目[一]

    我一直以为你要学nodejs你就要掌握很多东西啊!比如js最少得看10本书吧,nodejs书籍得看吧!其实呢,到最后,你会发现,因为工作,或者找工作的需要,什么不学,那些js不懂 也没有很大的关系.所 ...

  5. JMeter请求执行次数 你想执行几次就执行几次

    今天介绍下JMeter如何控制请求执行次数 主要有两种方式: 方式一:通过循环控制器控制每个请求的执行次数 例如:脚本执行规律是这样的,login-->customerPage-->sea ...

  6. 基本数据类型补充,深浅copy

    #str s=' ' #只能是以至少一个空格组成的字符串(全空格) print(s.isspace()) #tuple 当元组只有一个元素组成,并没有",",则该元素是什么数据类型 ...

  7. CentOS 7 输入中文 & 安装搜狗输入法

    1.CentOS 7 输入中文 安装时,若选择了中文,CentOS 7 自带中文输入法:汉语(Intelligent Pinyin). 设置方法: 应用程序 → 系统工具 → 设置 → 区域和语言 → ...

  8. Elastic 开发篇 javaAPI(4)

    1.解决精确匹配问题,如果不加配置,搜索农大,会搜出“农”“大”这两个字的匹配,我们要的是“农大”,那么好了,加上一个条件搞定: MatchQuery.Type.PHRASE 完整代码: packag ...

  9. ArrayList 实现随机点名

    package lijun.cn.demo1; import java.util.ArrayList; import java.util.Random; public class CallName { ...

  10. Linux 查看进程的线程数

    三种方法: 1. 使用top命令,具体用法是 top -H 加上这个选项,top的每一行就不是显示一个进程,而是一个线程. 2. 使用ps命令,具体用法是 ps -xH 这样可以查看所有存在的线程,也 ...