题目背景

本题开O2优化,请注意常数

题目描述

博艾市除了有海底高铁连接中国大陆、台湾与日本,市区里也有很成熟的轨道交通系统。我们可以认为博艾地铁系统是一个无向连通图。博艾有N个地铁站,同时有M小段地铁连接两个不同的站。

地铁计价方式很简单。从A站到B站,每经过一小段铁路(连接直接相邻的两个点的一条边),就要收取1博艾元。也就是说,从A站到B站,选择的路径不一样,要价也会不同。

我们认为凡华中学在1号地铁站。学生们通过地铁通勤,他们当然知道选择最短路来坐车的话,票价最便宜。

然而博艾地铁公司经营不善,一直亏损,于是他们打算提价。提价一次就是将一小段铁路原来收费1元改收2元。同一小段的铁路不会多次提价。他们打算提价Q次。

学生们知道,如果他们到学校的一条最短路径中的一小段提价了,可以改变路径,使总票价不变。然而随着一条一条的铁路被提价,当居住在某个站附近的学生发现,提价后,没有任何一种方案可以从家到学校的费用和初始费用相等时,就会不满。

现在地铁公司希望知道,对于每一次涨价,有多少个站,学生会因为涨价而不满呢?

输入输出格式

输入格式:

第一行为三个整数N,M,Q。

接下来M行,每行2个整数ai,bi,表示第i条铁路连接的两个站。i表示铁路编号。

接下来Q行,每行一行整数rj,表示每次涨价的铁路编号。

输出格式:

Q行。每行一个整数表示不满的车站数量。

输入输出样例

输入样例#1:

5 6 5
1 2
1 3
4 2
3 2
2 5
5 3
5
2
4
1
3
输出样例#1:

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地铁涨价的更多相关文章

  1. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  2. 洛谷 P1710 地铁涨价

    题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地 ...

  3. 洛谷P1710 地铁涨价 图论

    其实是个傻逼题但是我太傻逼了然后就错了无数遍总算A了 觉得不写个题解真是亏了 其实是 之前想了个超时想法 然后还自以为很对?后来看了题解发现还是比较妙的哦 于是就想着那还是发个题解记录下趴quq 正解 ...

  4. 洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)

    洛谷2583 地铁间谍(UVa1025A Spy in the Metro) 本题地址:http://www.luogu.org/problem/show?pid=2583 题目描述 特工玛利亚被送到 ...

  5. 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 ...

  6. P1710 地铁涨价

    题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地 ...

  7. 洛谷P2583 地铁间谍

    P2583 地铁间谍 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发 ...

  8. luogu P1710 地铁涨价

    嘟嘟嘟 一道最短路好题. 首先明确一点,把一条边的边权变成2,等于删去这条边.因为变成2后最短路肯定不会经过这条边,就相当于删去这条边了. 所以题目变成了依次删去Q条边,求每一次删完边后有几个点的最短 ...

  9. 洛谷10月月赛Round.3

    Rank11:260=60+100+100 P2409 Y的积木 题目背景 Y是个大建筑师,他总能用最简单的积木拼出最有创意的造型. 题目描述 Y手上有n盒积木,每个积木有个重量.现在他想从每盒积木中 ...

随机推荐

  1. 转 windows10 U盘系统启动盘怎么制作

    转 windows10 U盘系统启动盘怎么制作 现将http://jingyan.baidu.com/article/9f7e7ec05e24d56f29155455.html  将dvd 写入 is ...

  2. sdut1282Find the Path (floyd变形)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1282 感觉这题就比较有意思了 ,虽说是看了别人 ...

  3. 开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码

    开源一个Mac漂亮的小工具 PPRows for Mac, 在Mac上优雅的计算你写了多少行代码. 开源地址: https://github.com/jkpang/PPRows

  4. 学习笔记 第十三章 使用CSS3新布局

    第13章   使用CSS3新布局 [学习重点] 设计多列布局 设计弹性盒布局样式 使用CSS3布局技术设计适用移动需求的网页 13.1  多列布局 CSS3使用columns属性定义多列布局,用法如下 ...

  5. java visualVM 使用

    下载jdk 一般自带  jvisualvm.exe ,双击即可   下载地址   https://visualvm.github.io/pluginscenters.html 使用方法:

  6. iOS Programming NSUserDefaults

    iOS Programming NSUserDefaults  When you start an app for the first time, it uses its factory settin ...

  7. 10.3 Implementing pointers and objects and 10.4 Representing rooted trees

    Algorithms 10.3 Implementing pointers and  objects  and 10.4 Representing rooted trees Allocating an ...

  8. scrapy增加爬取效率

    增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. 降低日志级别 ...

  9. opencv实现人脸,人眼,微笑检测

    1.首先实现人脸检测 import cv2 img = cv2.imread("people.jpg",1) #读入图像 #导入人脸级联分类器引擎,“.xml”文件里包含了训练出来 ...

  10. bdflush - 将dirty缓存写回到磁盘的核心守护进程

    总览(SYNOPSIS) bdflush [opt] 描述(DESCRIPTION) bdflush 被用来启动核心守护进程将内存中的dirty缓存写到磁盘上.真正清洁工作是一个核心程序完成的. bd ...