[HNOI2014]道路堵塞

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

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

输出样例#1:

6
6

说明

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

数据已加强By Vfleaking

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int gg=1e5+29;
  4 inline void read(int &x){
  5     int f=1;x=0;char c=getchar();
  6     while(!isdigit(c)){
  7         if(c==‘-‘)f=-1;
  8         c=getchar();
  9     }
 10     while(isdigit(c)){
 11         x=(x<<3)+(x<<1)+c-‘0‘;
 12         c=getchar();
 13     }
 14     x*=f;
 15 }
 16 struct node{
 17     int net;
 18     int to;
 19     int w;
 20 }a[gg<<1];
 21 struct noded{
 22     int id,d;
 23     bool operator <(const noded &b) const {
 24         return d>b.d;
 25     }
 26 };
 27 int cnt;
 28 int head[gg],dis[gg],sum[gg],pos[gg],to[gg],fro[gg],ro[gg];
 29 bool vis[gg],ban[gg<<1];
 30 int n,m,l;
 31 priority_queue<noded>s;
 32 deque<int>q;
 33 inline void add(int i,int j,int w)
 34 {
 35     a[++cnt].to=j;
 36     a[cnt].net=head[i];
 37     a[cnt].w=w;
 38     head[i]=cnt;
 39 }
 40 inline void spfa(int qwq)
 41 {
 42     q.push_back(qwq);
 43     while(!q.empty())
 44     {
 45         int u=q.front();
 46         q.pop_front();
 47         vis[u]=false;
 48         for(register int i=head[u];i;i=a[i].net)
 49         {
 50             if(ban[i])
 51             continue;
 52             int v=a[i].to;
 53             if(dis[u]+a[i].w>=dis[v])
 54             continue;
 55             if(dis[v]>a[i].w+dis[u])
 56             dis[v]=a[i].w+dis[u];
 57             if(pos[v])
 58             s.push((noded){pos[v],dis[v]+sum[pos[v]]});
 59             else
 60             {
 61                 if(!vis[v])
 62                 {
 63                     vis[v]=true;
 64                     if(q.empty()||dis[v]>dis[q.front()])
 65                     {
 66                         q.push_back(v);
 67                     }
 68                     else
 69                     {
 70                         q.push_front(v);
 71                     }
 72                 }
 73             }
 74         }
 75     }
 76 }
 77 int main()
 78 {
 79     memset(dis,0x7f,sizeof(dis));
 80     memset(vis,false,sizeof(vis));
 81     dis[1]=0;
 82     read(n),read(m),read(l);
 83     for(register int i=1;i<=m;i++)
 84     {
 85         int x,y,z;
 86         read(x),read(y),read(z);
 87         add(x,y,z);
 88     }
 89     fro[1]=1;
 90     pos[1]=1;
 91     for(register int i=1;i<=l;i++)
 92     {
 93         read(ro[i]);
 94         ban[ro[i]]=true;
 95         fro[i+1]=a[ro[i]].to;
 96         pos[fro[i+1]]=i+1;
 97     }
 98     for(register int i=l;i;i--)
 99         sum[i]=sum[i+1]+a[ro[i]].w;
100     spfa(1)    ;
101     for(register int i=1;i<=l;i++)
102     {
103         while(!s.empty()&&s.top().id<=i)
104         s.pop();
105         if(s.empty())
106         cout<<-1<<endl;
107         else
108         printf("%d\n",s.top().d);
109         dis[a[ro[i]].to]=dis[fro[i]]+a[ro[i]].w;
110         spfa(fro[i+1]);
111     }
112     return 0;
113 }

原文地址:https://www.cnblogs.com/Hammer-cwz-77/p/8110562.html

时间: 2024-08-20 20:51:38

[HNOI2014]道路堵塞的相关文章

bzoj 3575: [Hnoi2014]道路堵塞

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

bzoj3575 [Hnoi2014]道路堵塞

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

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 道路堵塞

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条道路. 小人国的交通状况非常槽糕.有的时候由于交通堵塞,两座城市之间的道路会变得不连通, 直到拥堵解决,道路才会恢复畅通.初来咋到的你决心毛遂自荐到交通部某份差事,部长听说你来自一个科技高度 发达的世界,喜出望外地要求你编写一个查询应答系统,以挽救已经病入