题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3575


  大概的做法是,按照顺序枚举每一条要删去的边,(假设当前点为$u$,在最短路径上的下一个点是$v$)然后强制不走${u->v}$这条边,将$u$入队,做一遍以$1$号点为原点的SPFA(这个SPFA的dis值是要保留的,因为具有单调性同时也保证了复杂度),如果可以更新到一个最短路径上的点$x$,显然就说明在最短路径$u->x$的所有边被断去之后都可以由这条路径到达汇点,用一个堆维护最小值即可。

  注意:SPFA时最短路径上的点不能入队。因为某一条边不走的最短路相当于$1$--沿最短路-->$p1$-->……-->$p2$--沿最短路-->$n$

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<queue>
 8 #include<map>
 9 #include<cstring>
10 using namespace std;
11 #define maxn 1001000
12 #define inf 0x7fffffff
13 #define SIZE 1000000
14 #define llg int
15 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
16 llg n,m,posn,pos[maxn],dis[maxn],dl[maxn],head,tail,l,sp[maxn],bj[maxn],U,V,Z,dis_T[maxn];
17 vector<llg>a[maxn],val[maxn];
18
19 struct Edge{llg x,y,z;}e[maxn];
20
21 struct node
22 {
23     llg pos,val,wz;
24     bool operator<(const node&a)const{
25         return a.val<val;
26     }
27 };
28
29 priority_queue<node>q;
30
31 void init()
32 {
33     cin>>n>>m>>l;
34     llg x,y,z;
35     for (llg i=1;i<=m;i++)
36     {
37         scanf("%d%d%d",&x,&y,&z);
38         a[x].push_back(y),val[x].push_back(z);
39         e[i].x=x; e[i].y=y; e[i].z=z;
40     }
41     for (llg i=2;i<=n;i++) dis[i]=inf;
42     for (llg i=1;i<=l;i++)
43     {
44         scanf("%d",&sp[i]);
45         pos[e[sp[i]].x]=++posn;
46     }
47     for (llg i=l;i>=1;i--) dis_T[e[sp[i]].x]=dis_T[e[sp[i]].y]+e[sp[i]].z;
48     pos[n]=++posn;
49 }
50
51 void spfa(llg x)
52 {
53     llg v,w,st=x;
54     dl[1]=x; head=0; tail=1;
55     do
56     {
57         head%=SIZE;
58         x=dl[++head]; bj[x]=0;
59         w=a[x].size();
60         for (llg i=0;i<w;i++)
61         {
62             v=a[x][i];
63             if (v==V && x==U && Z==val[x][i]) continue;
64             if (dis[v]<dis[x]+val[x][i]) continue;
65             dis[v]=dis[x]+val[x][i];
66             if (!bj[v] && !pos[v])
67             {
68                 bj[v]=1;
69                 tail%=SIZE; dl[++tail]=v;
70             }
71             if (pos[v])
72             {
73                 if (pos[v]<=pos[st]) continue;
74                 node r;
75                 r.val=dis[v]+dis_T[v]; r.pos=pos[v]; r.wz=v;
76                 q.push(r);
77             }
78         }
79     }while (head!=tail);
80 }
81
82 int main()
83 {
84     yyj("road");
85     init();
86     for (llg i=1;i<=l;i++)
87     {
88         U=e[sp[i]].x,V=e[sp[i]].y,Z=e[sp[i]].z;
89         if (i!=1) dis[e[sp[i]].x]=dis[e[sp[i-1]].x]+e[sp[i-1]].z;
90         spfa(e[sp[i]].x);
91         while (!q.empty())
92         {
93             if (q.top().pos<=pos[e[sp[i]].x]) q.pop();else break;
94         }
95         if (q.empty()) puts("-1");else printf("%d\n",q.top().val);
96     }
97     return 0;
98 }


转载于:https://www.cnblogs.com/Dragon-Light/p/6430742.html

【BZOJ】3575: [Hnoi2014]道路堵塞相关推荐

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

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

  2. 【bzoj3575】 Hnoi2014—道路堵塞

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

  3. [HNOI 2014]道路堵塞

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

  4. 虚树(bzoj 3572: [Hnoi2014]世界树)

    例题: 一棵n个节点的树,m次查询,每次查询给你一个点集U,对于树上的所有节点x(x∉U),你要找到一个点y(y∈U)满足y点离x点最近且标号最小,表示x点受y点管辖,而你的任务就是对于每次查询输出U ...

  5. bzoj 2435: [Noi2011]道路修建 树上 dp

    2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  6. BZOJ 3571: [Hnoi2014]画框

    3571: [Hnoi2014]画框 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 996  Solved: 561 [Submit][Status ...

  7. bzoj 2435: [Noi2011]道路修建(DFS)

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 4110  Solved: 1429 [Submit][Sta ...

  8. BZOJ 3573 [HNOI2014]米特运输

    题目链接:传送门 冗长冗长的题面: 3573:[HNOI2014]米特运输3573: [HNOI2014]米特运输3573:[HNOI2014]米特运输 Description 米特是D星球上一种非常 ...

  9. bzoj 3572: [Hnoi2014]世界树

    Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息.持 ...

最新文章

  1. ECS应用管理最佳实践
  2. 如何在linux下安装mysql5.7?
  3. Java背景颜色怎么设成随机的_JS实现随机改变背景颜色
  4. spark mllib源码分析之随机森林(Random Forest)
  5. python写自动化工具_微软最强 Python 自动化工具开源了!不用写一行代码!
  6. maccmsv10 苹果cms 深度定制站群版
  7. axios, ajax和fetch的比较
  8. UVA11876 N + NOD (N)【欧拉筛法+前缀和】
  9. 唐雄燕点评NFV产业进程:2016年将迎来试点年
  10. java 字符串 数字个数_JAVA 统计字符串中中文,英文,数字,空格的个数
  11. WAN killer
  12. 基于itext的pdf拼接
  13. 数值计算之第二期:误差分析
  14. 【Unity】游戏开发过程中的前后台切换技术
  15. fx5800p编程教程_fx5800P编程计算器操作方法.pdf
  16. 【网络安全】前端程序员务必掌握的图片防盗链
  17. requests+正则表达式爬取猫眼电影TOP100!
  18. 封装一个简单实用的朋友圈
  19. 云服务器htdocs文件夹在,htdocs文件夹
  20. 4510. 寻宝!大冒险!

热门文章

  1. 复制选中的listbox内容
  2. 操作系统下查看HBA卡信息wwn的方法
  3. [CareerCup] 9.6 Generate Parentheses 生成括号
  4. [LaunchPad] 超声波测试,数码管显示
  5. python每隔30s检查一次_用Python写一个“离线语音提示器”来提醒我们别忘记了时间...
  6. Mat的初始化以及Mat与数组的相互转化
  7. 分享一个引起极度舒适的工作桌面
  8. 订单生产计划表范本_工厂生产管理为什么需要ERP软件?
  9. 帝国cms录入表单模板php,帝国cms7.5在线表单提交制作教程
  10. Gitlab添加SSH密钥的解决办法