洛谷P1710地铁涨价
题目背景
本题开O2优化,请注意常数
题目描述
博艾市除了有海底高铁连接中国大陆、台湾与日本,市区里也有很成熟的轨道交通系统。我们可以认为博艾地铁系统是一个无向连通图。博艾有N个地铁站,同时有M小段地铁连接两个不同的站。
地铁计价方式很简单。从A站到B站,每经过一小段铁路(连接直接相邻的两个点的一条边),就要收取1博艾元。也就是说,从A站到B站,选择的路径不一样,要价也会不同。
我们认为凡华中学在1号地铁站。学生们通过地铁通勤,他们当然知道选择最短路来坐车的话,票价最便宜。
然而博艾地铁公司经营不善,一直亏损,于是他们打算提价。提价一次就是将一小段铁路原来收费1元改收2元。同一小段的铁路不会多次提价。他们打算提价Q次。
学生们知道,如果他们到学校的一条最短路径中的一小段提价了,可以改变路径,使总票价不变。然而随着一条一条的铁路被提价,当居住在某个站附近的学生发现,提价后,没有任何一种方案可以从家到学校的费用和初始费用相等时,就会不满。
现在地铁公司希望知道,对于每一次涨价,有多少个站,学生会因为涨价而不满呢?
输入输出格式
输入格式:
第一行为三个整数N,M,Q。
接下来M行,每行2个整数ai,bi,表示第i条铁路连接的两个站。i表示铁路编号。
接下来Q行,每行一行整数rj,表示每次涨价的铁路编号。
输出格式:
Q行。每行一个整数表示不满的车站数量。
输入输出样例
5 6 5
1 2
1 3
4 2
3 2
2 5
5 3
5
2
4
1
3
0
2
2
4
4
说明
【样例解释】
次数 车站2 车站3 车站4 车站5
初始 1     1     2     2
1    1     1     2     2
2    1     2     2     3
3    1     2     2     3
4    2     2     3     3
5    2     2     4     3【数据范围】
对于20%的数据 N≤100, Q≤30
对于40%的数据 Q≤30
对于70%的数据 正确的输出结果中,不会有超过50种不一样的整数(数据范围剧透解法系列)
对于100%的数据 N≤100000, Q≤M≤200000
所有边权都是1,那么如果一条边原来在最短路上,边权增加以后,它就不再在原图的最短路上了。
于是问题转化成:求从最短路图中删边带来的影响
大概90%的删边问题都可以转化成:在一个所有需要删的边都删掉的图中,倒序加边
先求出原图最短路,然后把将要删的边都删掉。倒序加边,每次加边计算有多少个点到1的最短距离和原图上该点到1的最短距离相等。
之后答案求前缀和即可。
刚开始谜之30分,怒看题解。
当我发现我得代码和题解神似的时候,我的内心是欣喜的。
当我发现我WA是因为变量用混的时候,我的内心是崩溃的。
/*By SilverN*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,q;
struct mapp{
int x,y;
}eg[mxn];
struct edge{
int v,nxt,id;
}e[mxn<<];
int hd[mxn],mct=;
void add_edge(int u,int v,int id){
e[++mct].v=v;e[mct].nxt=hd[u];e[mct].id=id;hd[u]=mct;
}
//
int qe[mxn];bool ban[mxn];
int dis[mxn],mdis[mxn];
int ans[mxn];
int que[mxn];bool vis[mxn];
void BFS(){
int hed=,tl=,i,j;
que[++hed]=;vis[]=;
dis[]=;
while(hed<=tl){
int u=que[hed++];
for(i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
if(vis[v])continue;
dis[v]=dis[u]+;
vis[v]=;
que[++tl]=v;
}
}
return;
}
int DFS(int u,int fa){
int res=;
for(int i=hd[u],v;i;i=e[i].nxt){
v=e[i].v;
if(v==fa)continue;
if(dis[v]!=dis[u]+ && mdis[v]==dis[u]+){
dis[v]=dis[u]+;
res++;
res+=DFS(v,u);
}
}
return res;
}
void sol(){
int i,j;
for(i=q;i;--i){
int now=qe[i];
int x=eg[now].x,y=eg[now].y;
add_edge(x,y,now);
add_edge(y,x,now);
if(dis[x]==mdis[x]&&dis[y]!=mdis[y]&&mdis[y]==dis[x]+){
dis[y]=dis[x]+;
ans[i]=DFS(y,x)+;
continue;
}
if(dis[y]==mdis[y]&&dis[x]!=mdis[x]&&mdis[x]==dis[y]+){
dis[x]=dis[y]+;
ans[i]=DFS(x,y)+;
}
}
return;
}
int main(){
n=read();m=read();q=read();
int i,j,u,v;
for(i=;i<=m;++i){
eg[i].x=read();eg[i].y=read();
add_edge(eg[i].x,eg[i].y,i);
add_edge(eg[i].y,eg[i].x,i);
}
for(i=;i<=q;++i)qe[i]=read(),ban[qe[i]]=;
BFS();
//
memcpy(mdis,dis,sizeof dis);//保存最短距离
memset(dis,0x3f,sizeof dis);
memset(vis,,sizeof vis);
memset(e,,sizeof e);
memset(hd,,sizeof hd);
mct=;
//reload
for(i=;i<=m;++i){
if(!ban[i]){
add_edge(eg[i].x,eg[i].y,i);
add_edge(eg[i].y,eg[i].x,i);
}
}
dis[]=;
BFS();
sol();
for(i=;i<=q;++i){
ans[i]+=ans[i-];
printf("%d\n",ans[i]);
}
return ;
}
洛谷P1710地铁涨价的更多相关文章
- 洛谷P1710 地铁涨价
		P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ... 
- 洛谷 P1710 地铁涨价
		题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地 ... 
- 洛谷P1710 地铁涨价 图论
		其实是个傻逼题但是我太傻逼了然后就错了无数遍总算A了 觉得不写个题解真是亏了 其实是 之前想了个超时想法 然后还自以为很对?后来看了题解发现还是比较妙的哦 于是就想着那还是发个题解记录下趴quq 正解 ... 
- 洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)
		洛谷2583 地铁间谍(UVa1025A Spy in the Metro) 本题地址:http://www.luogu.org/problem/show?pid=2583 题目描述 特工玛利亚被送到 ... 
- uva A Spy in the Metro(洛谷 P2583 地铁间谍)
		A Spy in the Metro Secret agent Maria was sent to Algorithms City to carry out an especially dangero ... 
- P1710 地铁涨价
		题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地 ... 
- 洛谷P2583 地铁间谍
		P2583 地铁间谍 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发 ... 
- luogu P1710 地铁涨价
		嘟嘟嘟 一道最短路好题. 首先明确一点,把一条边的边权变成2,等于删去这条边.因为变成2后最短路肯定不会经过这条边,就相当于删去这条边了. 所以题目变成了依次删去Q条边,求每一次删完边后有几个点的最短 ... 
- 洛谷10月月赛Round.3
		Rank11:260=60+100+100 P2409 Y的积木 题目背景 Y是个大建筑师,他总能用最简单的积木拼出最有创意的造型. 题目描述 Y手上有n盒积木,每个积木有个重量.现在他想从每盒积木中 ... 
随机推荐
- D. Leaving Auction  一题很好的思维题
			http://codeforces.com/contest/749/problem/D 现在发现做题要把样例抄下来,然后画一画,这样才容易发现新大陆.嗯,以后做题就这样. 如果排除了被删除了的人,那么 ... 
- ZOJ 3605Find the Marble(dp)
			ZOJ 3605 大体意思就是 找出随机选了K个交换后 石子在第i个罐子里的概率最大 也就是可能的总数最大 这样就可以写出递推方程 dp[i][j][k] += dp[i-1][e][k]; (0&l ... 
- Netflix正式开源其API网关Zuul 2--转
			微信公众号:聊聊架构 5 月 21 日,Netflix 在其官方博客上宣布正式开源微服务网关组件 Zuul 2.Netflix 公司是微服务界的楷模,他们有大规模生产级微服务的成功应用案例,也开源了相 ... 
- JDK常用类解读--String
			一.字符串的不变性: 文章使用的源码是jdk1.8的.(下同) 1.首先可以看到`String`是`final`类,说明该类不可继承,保证不会被子类改变语义 2.String的值实际上就是一个字符数组 ... 
- AJPFX关于Java NIO的概述总结
			Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Sel ... 
- 完美单例宏定义(兼容ARC和MRC),项目中可以直接使用
			单例模式: 1.永远只分配一块内存来创建对象 2.提供一个类方法, 返回内部唯一的一个对象(一个实例) 3.最好保证init方法也只初始化一次 写一个宏定义文件,传入宏定义函数名,自动生成符合类名的 ... 
- P1583 魔法照片
			题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ... 
- AlertDialog的实现
			课程Demo 重点解析自定义对话框 public class MainActivity extends AppCompatActivity { private Button bt1; private ... 
- Android学习笔记(十五) Http
			1.Http协议概要 应用程序和服务间的请求/响应是无状态的,即响应完即断开连接. HttpClient库是Android自带的,故无需引入该库 2.Http请求和获取数据 生成代表客户端的HttpC ... 
- ES6特性的两点分析
			块级作用域声明let.constES6中const 和let的功能,转换为ES5之后,我们会发现实质就是在块级作用改变一下变量名,使之与外层不同.ES6转换前: let a1 = 1; let a2 ... 
