洛谷 [HNOI2014]道路堵塞 解题报告
[HNOI2014]道路堵塞
题意
给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路。
又事SPFA玄学...
有个结论,新的最短路一定是\(1\sim l,l\sim r,r\sim n\)组成的,中间一段是非最短路,两边是原最短路
先删去最短路
然后从1开始枚举短边,按顺序维护\(1\sim i\)前\(i\)个点连到\(r\sim n\)的最小值,发现我们要根据\(r\)的变换进行删除,可以拿一个堆维护。
剩下的对每个点跑跑\(SPFA\)就可以了,每次注意删去不参与松弛的那条边。
感性上是只跑了一次\(SPFA\)的
Code:
#include <cstdio>
#include <cstring>
#include <queue>
#include <cctype>
int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
const int N=2e5+10;
int head[N],to[N],Next[N],edge[N],cnt;
void add(int u,int v,int w)
{
to[++cnt]=v,edge[cnt]=w,Next[cnt]=head[u],head[u]=cnt;
}
struct node{int u,v,w;}E[N];
int n,m,L,used[N],dis[N],disl[N],disr[N],num[N],ban[N],path[N],s[N],vis[N],tot;
struct yuucute
{
int v,w;
bool friend operator <(yuucute a,yuucute b){return a.w>b.w;}
}yuu[N];
std::priority_queue <yuucute> Q;
void spfa(int ss,int ban,int tim)
{
dis[ss]=disl[ss];
std::queue <int> q;
q.push(ss);
tot=0;
while(!q.empty())
{
int now=q.front();
q.pop();
used[now]=0;
for(int v,i=head[now];i;i=Next[i])
if(((v=to[i])!=ban||now!=ss)&&dis[v]>dis[now]+edge[i])
{
dis[v]=dis[now]+edge[i];
if(num[v]>tim){if(vis[v]!=tim) vis[s[++tot]=v]=tim;}
else if(!used[v]) {q.push(v);used[v]=1;}
}
}
while(tot)
{
int now=s[tot--];
if(!yuu[now].v||yuu[now].w>dis[now]+disr[now])
{
yuu[now].w=dis[now]+disr[now];
yuu[now].v=now;
Q.push(yuu[now]);
}
}
}
int main()
{
n=read(),m=read(),L=read();
for(int i=1;i<=m;i++) E[i].u=read(),E[i].v=read(),E[i].w=read();
for(int i=1;i<=L;i++)
{
ban[path[i]=read()]=1;
num[E[path[i]].u]=i;
disl[E[path[i]].v]=disl[E[path[i]].u]+E[path[i]].w;
}
num[n]=L+1;
for(int i=L;i;i--) disr[E[path[i]].u]=disr[E[path[i]].v]+E[path[i]].w;
for(int i=1;i<=m;i++) if(!ban[i]) add(E[i].u,E[i].v,E[i].w);
memset(dis,0x3f,sizeof dis);
for(int i=1;i<=L;i++)
{
spfa(E[path[i]].u,E[path[i]].v,i);
while(!Q.empty()&&num[Q.top().v]<=i) Q.pop();
if(Q.empty()) puts("-1");
else printf("%d\n",Q.top().w);
}
return 0;
}
2019.2.18
洛谷 [HNOI2014]道路堵塞 解题报告的更多相关文章
- 洛谷 P1070 道路游戏 解题报告
P1070 道路游戏 题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有\(n\)个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依 ...
- 洛谷 P1783 海滩防御 解题报告
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷1087 FBI树 解题报告
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
- 洛谷 P3313 [SDOI2014]旅行 解题报告
P3313 [SDOI2014]旅行 题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教 ...
- 洛谷 P3629 [APIO2010]巡逻 解题报告
P3629 [APIO2010]巡逻 题目描述 在一个地区中有 n 个村庄,编号为 1, 2, ..., n.有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通 ...
- 洛谷 P1850 换教室 解题报告
P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1≤i≤n) ...
- 洛谷 P1363 幻想迷宫 解题报告
P1363 幻想迷宫 题目描述 背景 Background (喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫.) WD:呜呜,肿么办啊-- LHX:mo ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
随机推荐
- 分布式系统session一致性的问题
session的概念 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Sessio ...
- NFS共享文件系统部署
1. 概述 本篇博客主要是介绍如何安装和使用NFS服务. 2. 安装软件包 首先确认系统是否已经安装相应的软件包,执行命:rpm -qa | egrep "rpcbind|nfs-utils ...
- linux下向一个文件中的某行插入数据的做法
sed -i 'ni\x' test.file 表示向test.file文件里的第n行的前面添加x内容sed -i 'na\x' test.file 表示向test.file ...
- Week2 关于代码规范的一些认识
代码规范 我觉得代码规范是有必要的,而对于以下的四个观点我要提出自己的反驳: 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西 首先应该明白,什么是“编码规范”?它不 ...
- SSH框架开发蛋糕房管理系统之质量属性
SSH框架开发蛋糕房管理系统之质量属性 我要开发的系统是基于ssh框架的蛋糕房管理系统.本系统前台提供的主要功能是在线预定蛋糕,本店管理员拥有最高权限,包括收银管理,设备管理,日常销售管理,蛋糕定制管 ...
- R和python语言如何求平均值,中位数和众数
均值是通过取数值的总和并除以数据序列中的值的数量来计算. R语言平均值公式: mean(x, trim = 0, na.rm = FALSE, ...)#x - 是输入向量.trim - 用于从排序的 ...
- spring mvc的工作原理
该文转载自:http://blog.csdn.net/u012191627/article/details/41943393 SpringMVC框架介绍 1) spring MVC属于SpringFr ...
- C语言复制文件的两种简单的方法【从根本解决问题】
网上的方法大致有这样几种: 1.使用操作系统提供的复制文件的API 2.使用C语言本身提供的复制文件的函数 3.直接读写文件,从文件角度来操作,从而直接将一个文件复制 这里我们使用的就是这第三种. 复 ...
- 软件工程_9th weeks
PSP DATE START_TIME END_TIME EVENT TYPE TIME 4.30-5.3 5:30 4:00 旅游 娱乐 72h 5.3 14:00 17:0 ...
- python 授权
1.“包装”意思是一个已经存在的对象进行包装,不管他是数据类型还是一段代码,可以是对一个已经存在的对象增加新的,删除不要的或者修改其他已经存在的功能 2.包装 包括定义一个类,他的实例拥有标准类型的核 ...