bzoj3575 [Hnoi2014]道路堵塞

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。

Sample Input

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

Sample Output

6
6

HINT

100%的数据满足2<N<100000,1<M<200000。所用道路长度大于0小于10000。
数据已加强By Vfleaking

正解:$spfa$最短路+堆。

这题正解太鬼畜了。。简直毫无道理可言啊。。

首先,我们可以$yy$一下,一个图去掉最短路的一条边以后的最短路可以分为$3$条路:$1$->最短路上的点$u$->一条非最短路->最短路上的点$v$->$n$。于是我们就可以一顿乱搞了。。

首先,我们预处理出$1-n$的最短路和$n-1$的最短路。然后,我们删除每条边时,我们把这条边的入点弄出来,并限制住这条边,跑一遍$spfa$,当我们松弛到当前点$u$在最短路上更靠后的点时,我们就把当前$1-n$的路算出来,把这条路丢到堆里去。最后我们把堆中包含当前堵塞的路弹掉,然后直接查询最小距离就行了。不过为什么这个做法复杂度是对的。。

  1 //It is made by wfj_2048~
  2 #include <algorithm>
  3 #include <iostream>
  4 #include <complex>
  5 #include <cstring>
  6 #include <cstdlib>
  7 #include <cstdio>
  8 #include <vector>
  9 #include <cmath>
 10 #include <queue>
 11 #include <stack>
 12 #include <map>
 13 #include <set>
 14 #define inf (1<<30)
 15 #define N (100010)
 16 #define il inline
 17 #define RG register
 18 #define ll long long
 19 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
 20
 21 using namespace std;
 22
 23 struct data{
 24     int id,dis;
 25     bool operator < (const data &a) const{
 26     return dis>a.dis;
 27     }
 28 };
 29
 30 struct edge{ int nt,to,dis; }g1[2*N],g2[2*N];
 31
 32 struct E{ int u,v,w; }G[2*N];
 33
 34 priority_queue <data> Q;
 35
 36 int head1[N],head2[N],vis[N],vi[N],dis[N],dis1[N],dis2[N];
 37 int lim[N],id[N],s[N],q[50*N],n,m,l,cnt,ecnt,num1,num2;
 38
 39 il int gi(){
 40     RG int x=0,q=1; RG char ch=getchar();
 41     while ((ch<‘0‘ || ch>‘9‘) && ch!=‘-‘) ch=getchar();
 42     if (ch==‘-‘) q=-1,ch=getchar();
 43     while (ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-48,ch=getchar();
 44     return q*x;
 45 }
 46
 47 il void insert1(RG int from,RG int to,RG int dis){
 48     g1[++num1]=(edge){head1[from],to,dis},head1[from]=num1; return;
 49 }
 50
 51 il void insert2(RG int from,RG int to,RG int dis){
 52     g2[++num2]=(edge){head2[from],to,dis},head2[from]=num2; return;
 53 }
 54
 55 il void spfa(RG int S,RG int lim){
 56     RG int h=0,t=1; dis[S]=dis1[S],vis[S]=1,q[t]=S;
 57     while (h<t){
 58     RG int x=q[++h],v;
 59     for (RG int i=head1[x];i;i=g1[i].nt){
 60         if (i==lim) continue; v=g1[i].to;
 61         if (id[v]>id[S]) Q.push((data){id[v],dis[x]+g1[i].dis+dis2[v]});
 62         else if (dis[v]>dis[x]+g1[i].dis){
 63         dis[v]=dis[x]+g1[i].dis;
 64         if (!vis[v]) vis[v]=1,q[++t]=v;
 65         }
 66     }
 67     vis[x]=0;
 68     }
 69     return;
 70 }
 71
 72 il void work(){
 73     n=gi(),m=gi(),l=gi();
 74     for (RG int i=1,u,v,w;i<=m;++i){
 75     u=gi(),v=gi(),w=gi(),G[++ecnt]=(E){u,v,w};
 76     insert1(u,v,w),insert2(v,u,w);
 77     }
 78     for (RG int i=1,x;i<=l;++i){
 79     x=gi(),vi[G[x].u]=vi[G[x].v]=1;
 80     s[i]=G[x].u,s[i+1]=G[x].v,lim[G[x].u]=x;
 81     dis1[G[x].v]=dis1[G[x].u]+g1[x].dis;
 82     dis2[G[x].u]=g1[x].dis,id[s[i]]=++cnt;
 83     }
 84     id[s[l+1]]=++cnt;
 85     for (RG int i=l;i;--i) dis2[s[i]]+=dis2[s[i+1]];
 86     for (RG int i=1;i<=n;++i) dis[i]=inf;
 87     for (RG int i=1;i<=l;++i){
 88     spfa(s[i],lim[s[i]]);
 89     while (!Q.empty() && Q.top().id<=id[s[i]]) Q.pop();
 90     if (Q.empty()){ puts("-1"); continue; }
 91     printf("%d\n",Q.top().dis);
 92     }
 93     return;
 94 }
 95
 96 int main(){
 97     File("road");
 98     work();
 99     return 0;
100 }
时间: 2024-10-13 03:01:14

bzoj3575 [Hnoi2014]道路堵塞的相关文章

BZOJ3575 HNOI2014 道路阻塞

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

bzoj 3575: [Hnoi2014]道路堵塞

Description A 国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径, 并且保证这条路径的长度是所有从城市1到城市N的路径中最短的.不幸的是,因为从城市1到城市N旅行的人越来越多,这条由交通部指定的路径经常发生堵塞. 现在A国想知道,这条路径中的任意一条道路无法通行时,由城市1到N的最短路径长度是多少. Input 输入文件第一行是三个用空格分开的正整数N.M和L,分别表示城市数目.单向道路数目

[HNOI2014]道路堵塞

题目描述 A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有从城市1到城市N的路径中最短的.不幸的是,因为从城市1到城市N旅行的人越来越多,这条由交通部指定的路径经常发生堵塞.现在A国想知道,这条路径中的任意一条道路无法通行时,由城市1到N的最短路径长度是多少. 输入输出格式 输入格式: 输入文件第一行是三个用空格分开的正整数N.M和L,分别表示城市数目.单向道路数目和交通

BZOJ 3575 道路堵塞

Description A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有从城市1到城市N的路径中最短的.不幸的是,因为从城市1到城市N旅行的人越来越多,这条由交通部指定的路径经常发生堵塞.现在A国想知道,这条路径中的任意一条道路无法通行时,由城市1到N的最短路径长度是多少. Input 输入文件第一行是三个用空格分开的正整数N.M和L,分别表示城市数目.单向道路数目和交通

第10章 智能交通

10.1智能交通概述 10.1.1传统交通与智能交通   10.1.2智能交通的定义 智能交通在世界各地迅速推进,已成为现代交通的重要标志,然而,对于这个专用名词,国际上至今没有一个明确的定义.在美.欧.日的ITS推进组织的网页或有关资料中,我们看到分别有如下的叙述. “美国智能运输协会”(ITS America网址为型:i!望:Q蟹):ITS是由一些技术组成的,这些技术包括信息处理.通信.控制和电子技术.交通事故.拥挤使我们为生活.为损失的 生产率和浪费的能源付出了昂贵的代价.ITS可以通过新

HNOI 2014

D1T1:画框 frame 题意:给你两个n阶正整数方阵,请你求最大的\( \sum_{i = 1}^{n} A_{i, p_i}\times \sum_{i = 1}^{n} B_{i, p_i}  \)其中\({p_i}\)是一个n的排列.\(n \le 70\). 如果A=B,这就是一个二分图最大完美匹配问题,那么我们可以用费用流或者KM算法解决,然而A却可以不等于B,我们需要另辟蹊径. 当年我看到这道题就只会随机化乱搞,现在看来,如果仔细的思考还是可以搞出来的. 想到,我们可以求出对于A

大数据的十大来源及其应用价值

当你开车路过一家餐厅的停车场时,你的手机屏幕上弹出了这家餐厅的当日特价菜品推荐,这种体验是不是很棒?如果×××老板把发牌人忘记付给你的20美元亲自送还给你,你的心里是不是有点儿小激动?如果在线视频游戏能够把和我们玩法相近的用户即刻告知我们,这世界会不会变得很美妙?你是不是要下调汽车保险费率?大数据能让这一切变成现实. 网络数据即使不是最原始的大数据源,也是使用最广泛.认可度最高的大数据源.除此之外,还有很多大数据源,它们都有各自的使用价值.其中一些广为人知,而另一些几乎没有名气.我们在此要借用本

bzoj 3572 [Hnoi2014]世界树(虚树+DP)

3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 645  Solved: 362[Submit][Status][Discuss] Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息.持续运转的根本基石.     世界树的形态可以用一个数学模型来描述:世界树中有n个

[BZOJ 1018][SHOI2008]堵塞的交通traffic(线段树)

Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个 城市和3C-2条道路. 小人国的交通状况非常槽糕.有的时候由于交通堵塞,两座城市之间的道路会变得不连通, 直到拥堵解决,道路才会恢复畅通.初来咋到的你决心毛遂自荐到交通部某份差事,部长听说你来自一个科技高度 发达的世界,喜出望外地要求你编写一个查询应答系统,以挽救已经病入