Description

A 国有N座城市,依次标为1到N。同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数。现在,A国交通部指定了一条从城市1到城市N的路径, 并且保证这条路径的长度是所有从城市1到城市N的路径中最短的。不幸的是,因为从城市1到城市N旅行的人越来越多,这条由交通部指定的路径经常发生堵塞。 现在A国想知道,这条路径中的任意一条道路无法通行时,由城市1到N的最短路径长度是多少。

Input

输入文件第一行是三个用空格分开的正整数N、M和L,分别表示城市数目、单向道路数目和交通部指定的最短路径包含多少条道路。
按下来M行,每行三个用空格分开的整数a、b和c,表示存在一条由城市a到城市b的长度为c的单向道路。这M行的行号也是对应道路的编号,即其中第1行对
应的道路编号为1,第2行对应的道路编号为2,…,第M行对应的道路编号为M。最后一行为L个用空格分开的整数sp(1)…,,sp(L),依次表示从城
市1到城市N的由交通部指定的最短路径上的道路的编号。

Output

输出文件包含L行,每行为一个整数,第i行(i=1,2…,,L)的整数表示删去编号为sp(i)的道路后从城市1到城市N的最短路径长度。如果去掉后没有从城市1到城市N的路径,则输出一1。

真的是连SPFA都不会...

根据玄学猜想:删掉最短路上的一条边后的最短路一定是由三段组成:

最短路上的一段 1--x,非最短路上的一段x--y,以及最短路上的一段y--n;

然后对于每次删掉一条连接(u,v)的边我们就把u放入队列中,并强制不走删掉的那一条边,拿u来松弛其它点到1的最短路

如果走到了最短路上的某个点x,并且该点在最短路上的标号比u大(在u后面),把这个点放入堆中即可

这个我们只需要维护好两个数组,一个1到每个最短路上的点的距离,一个是每个最短路上的点到n的距离

之后就可以愉快的跑SPFA了

// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=700050;
int gi()
{
int x=0,flag=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') flag=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*flag;
}
int head[N],to[N],nxt[N],c[N],cnt;
int pre[N],pre2[N],id[N],to2[N],n,m,L;
int a[N],vis[N],vis2[N],q[N*10],q2[N*10],dis[N];
struct data{
int id,dis;
bool operator < (const data &a) const {return a.dis<dis;}
}b[N];
priority_queue<data>Q;
void lnk(int x,int y,int z){
to[++cnt]=y,c[cnt]=z,nxt[cnt]=head[x],head[x]=cnt;
}
void spfa(int x,int y,int z){
dis[x]=pre[id[x]];int t=0,sum=1,tail=0;q[0]=x;q2[++tail]=x;
vis[x]=1;
for(int i=1;i<=L+1;i++) vis2[to2[i]]=0;
while(t<sum){
int now=q[t++];vis[now]=0;
for(int i=head[now];i;i=nxt[i]){
if(i!=y){
int u=to[i];
if(id[u]>z){
if(!vis2[u]){
b[u].dis=dis[now]+c[i]+pre2[id[u]];
b[u].id=id[u];vis2[u]=1;
q2[++tail]=u;
}
else b[u].dis=min(b[u].dis,dis[now]+c[i]+pre2[id[u]]);
}
else{
if(dis[u]>dis[now]+c[i]){
dis[u]=dis[now]+c[i];
if(!vis[u]) vis[u]=1,q[sum++]=u;
}
}
}
}
}
while(tail) Q.push(b[q2[tail]]),tail--;
}
int main(){
n=gi(),m=gi(),L=gi();
for(int i=1;i<=m;i++){
int x=gi(),y=gi(),z=gi();
lnk(x,y,z);
}
to2[1]=id[1]=1;
for(int i=1;i<=L;i++){
a[i]=gi();
to2[i+1]=to[a[i]];
id[to[a[i]]]=i+1;
}
for(int i=1;i<=L;i++) pre[i+1]=pre[i]+c[a[i]];
for(int i=L;i>=1;i--) pre2[i]=pre2[i+1]+c[a[i]];
memset(dis,127,sizeof(dis));
for(int i=1;i<=L;i++){
spfa(to2[i],a[i],i);
while(!Q.empty()&&Q.top().id<=i) Q.pop();
if(Q.empty()) puts("-1");
else printf("%d\n",Q.top().dis);
}
}

bzoj 3575: [Hnoi2014]道路堵塞的更多相关文章

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

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

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

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

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

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

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

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

  5. [HNOI2014]道路堵塞

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

  6. bzoj3575[Hnoi2014]道路堵塞

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

  7. 【bzoj3575】 Hnoi2014—道路堵塞

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

  8. luogu P3238 [HNOI2014]道路堵塞

    传送门 这什么题啊,乱搞就算了,不知道SPFA已经死了吗 不对那个时候好像还没死 暴力就是删掉边后跑Dijkstra SPFA 然后稍微分析一下,可以发现题目中要求的不经过最短路某条边的路径,一定是先 ...

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

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

随机推荐

  1. 【OCR技术系列之一】字符识别技术总览

    最近入坑研究OCR,看了比较多关于OCR的资料,对OCR的前世今生也有了一个比较清晰的了解.所以想写一篇关于OCR技术的综述,对OCR相关的知识点都好好总结一遍,以加深个人理解. 什么是OCR? OC ...

  2. 解决div里面img标签后面跟着空白符

    直接在div里面添加img标签有一个坑,img的高度会莫名添加几个像素的高度,查询之后才知道原来css2出现的问题. 引起这个问题原来是img标签默认基线引起的,vertical-align:base ...

  3. iphone6 plus导入联系人或者通讯录

    iphone6 plus快速导入联系人或者通讯录(使用QQ同步助手,真的很简单) 最近换了部手机,由于之前的手机保存联系人都是保存在手机,没有备份在sim卡,由于sim卡被我剪小了,不能插回原来的手机 ...

  4. js笔记(制作一个简单的计数器)

    首先编写静态页中的按钮: <input  id="result" type="button" value="该程序已经运行了0秒!"/ ...

  5. 关于如何在微信里面让video不全屏播放

    发现一个更简单的解决方法,加上一条属性即可.x5-video-player-type="h5″.通过设置这个属性,让video开启同层H5播放器.另外在X5内核里,video是单独的一个vi ...

  6. 这一次带你彻底了解Cookie

    前言 网络早期最大的问题之一是如何管理状态.简而言之,服务器无法知道两个请求是否来自同一个浏览器.当时最简单的方法是在请求时,在页面中插入一些参数,并在下一个请求中传回参数.这需要使用包含参数的隐藏的 ...

  7. HDU1864--01背包

    最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. HDU4046--Panda(树状数组)

    Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. page 简单易懂 分页

    基础分页功能 <?php class Page{  //$count是用户设定的值      public $a;    function pages($count,$page_num,$url ...

  10. gis电子地图开发公司面临的挑战和机遇

    从上个世纪90年代开始电子地图应用就已经收到人们的关注,但是由于时代的局限性和市场经济发展的不成熟.地理信息系统系统的应用并没有得到很好的利用.只有少数的国家机构和军事系统才能够使用这些应用.随着技术 ...