题目

描述

不知每日疲于在城市的水泥森林里奔波的你会不会有时也曾向往过乡村的生活。你会不会幻想过,在夏日一个静谧的午后,你沉睡于乡间路边的树荫里,一片叶子落在了你的肩上, 而你正做着一个悠长的梦,一个没有城市的梦。我们的问题,正围绕着这个梦境展开……

从 Azure 求学的城市到 Azure 家乡的村庄由若干条路径连接,为了简化起见,我们把这些路径抽象成一个 N 个节点的无向图,每个节点用一个[1,N]内的整数表示,其中城市在S节点,Azure 的故乡在T 节点。在某些节点对(x,y)之间会有双向道路连接,道路的长度为c。不过最近某些道路可能会在施工,Azure 想知道,假如某条道路被施工而不能通行的话, 他到故乡的最短路经的长度为多少(多次询问)。

N,M,Q≤200000N,M,Q\leq 200000N,M,Q≤200000

题目大意

给你一个带权无向图,有起点和终点。然后有许多询问,询问删除某两点之间的边后的最短路。


分析&正解

这题是在某个PPT里看到的,都不知道在哪里可以评测,所以干脆没有打。

看看这题,感觉好像是一个非常经典的题型,可是……想不出来。

有一个思路:建立最短路图。

这个思路还是容易想到的,建立最短路图之后,如果删去的边不在最短路图之内,那么最短路就不变!

我们发现有些点是没有意义的,所以把它们删去。

最后形成的这个最短路图有一些有趣的性质。

先说明一下,这个最短路图还是当成无向图(我们平常建立的最短路图都是有向图)。

发现这个最短路图中有边双,缩点,然后继续观察。

我们会发现缩点之后的图是一条链。

为什么?万一是一棵树呢?

如果是一棵树,

因为这个图有起点和终点,我们假设起点在根节点,那么终点在某个叶子节点中。

由于我们已经在前面删掉了无意义的点,就是不会到终点的点。

那么除了起点到终点的这一条链,其它的分支都是没有意义的,所以会被删去。

这个结论很重要。

显然,如果删去的边在某个边双中,最短路的长度也是不会变的。

现在我们只需要思考,如果删去的是桥边,那么如何计算。

对于这些删去桥边的情况离线计算:

建立一个小根堆堆,存一些边,对于每个边(u,v)(u,v)(u,v),存入的值为disSu+len(u,v)+disTvdisS_u+len(u,v)+disT_vdisSu​+len(u,v)+disTv​。

它代表了如果必须走这条边的最短路径。

然后一个一个扫边双,到了某个边双之后,就将所有从先前的边双连向它的边从堆中删去,然后将所有从它连向后面的边双的边加进来。

搞完之后,如果要删去这个边双和下一个边双之间的桥边,那么堆中的最小值就是答案。

为什么这么做?

先不考虑删除边,

如果边(u,v)(u,v)(u,v)不得不经过,为了使得路径长度最小,那么起点到uuu,vvv到终点,这两段的路径一定在最短路图之中。

当一个边双和下一个边双之间的桥断开的时候,我们不能走桥,不得不走其它的路径。

必须要经过某一条跨过中间的边。

所以,我们要将不跨过中间的边,也就是之前的边双连向这个边双的边删去,然后把新的边加进来。

时间复杂度是O((N+M+Q)lg⁡N)O((N+M+Q)\lg N)O((N+M+Q)lgN),很优秀。


总结

在见到某些类似于动态最短路题目的时候,我们可以想到建立最短路图。

然后注意最短路图在缩点之后会变成一条链(有起点和终点的情况下)。

最后就是想想如何在边双之间处理东西。

感觉上这道题还挺不错,可惜没有地方评测……

[violet6] 故乡的梦的更多相关文章

  1. 【BZOJ-2725】故乡的梦 Dijsktra + Tarjan + Dinic + BFS + 堆

    2725: [Violet 6]故乡的梦 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 502  Solved: 173[Submit][Status ...

  2. BZOJ 2725: [Violet 6]故乡的梦 最短路+线段树

    2725: [Violet 6]故乡的梦 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 678  Solved: 204[Submit][Status ...

  3. BZOJ2725 : [Violet 6]故乡的梦

    如果S==T,那么答案为0. 如果S与T不连通,那么答案为inf. 否则,S到T的最短路径上至少有一条边. 求出以S为源点的最短路图,是个DAG,随便抓一条S到T的最短路,记为P. 设dpS[x]表示 ...

  4. [原博客] BZOJ 2725 : [Violet 6]故乡的梦

    这个题在bzoj上好像是个权限题,想做的可以去Vani的博客下载测试数据.这里有题面. 简单叙述一下题意:给你一个n个点.m条边的带权无向图,S点和T点,询问Q次删一条给定的边的S-T最短路. 其中  ...

  5. BZOJ 2725 [Violet 6]故乡的梦 线段树+最短路树

    \(\color{#0066ff}{ 题目描述 }\) \(\color{#0066ff}{输入格式}\) \(\color{#0066ff}{输出格式}\) \(\color{#0066ff}{输入 ...

  6. BZOJ 2725: [Violet 6]故乡的梦

    求出最短路径树,对于一个询问(x,y) 若不在树上S->T的链上,则答案不变,若在链上,考虑用一条非树边替换这条边,这条非树边必须跨越x->y这条边,线段树维护区间最小值 #include ...

  7. bzoj violet系列 (2708~2725)

    cbh大爷说:写博客不能弃坑. orz cbh 那我就来更新博客了. violet这个系列的题好神啊……出题人好劲啊…… ……怎么最近都在理性愉悦啊…… 另外bzoj400题纪念~ 2708: [Vi ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. BZOJ 5395--[Ynoi2016]谁的梦(STL&容斥)

    5395: [Ynoi2016]谁的梦 Time Limit: 80 Sec  Memory Limit: 128 MBSubmit: 22  Solved: 7[Submit][Status][Di ...

随机推荐

  1. 笔试题-求小于等于N的数中有多少组素勾股数

    题目描述: 一组勾股数满足:a2+b2=c2: 素勾股数:a,b,c彼此互质. 输入正整数N: 输出小于等于N的数中有多少组勾股数. 例: 输入:10 输出:1 思路:我是直接暴力破解的…… 首先找出 ...

  2. Spring源码由浅入深系列六 CreateBean过程

  3. MongoDB点滴

    0 http://blog.csdn.net/mydeman/article/details/6652387 1 MongoDB 内置连接池,不需要使用额外的连接池驱动 Note: The Mongo ...

  4. 27. USART, Universal synchronous asynchronous receiver transmitter

    27.1 USART introduction 通用同步异步接收发射机(USART)对需要NRZ异步串行数据格式行业标准的外部设备,提供了一个灵活的全双工数据交换的方法.USART使用分数波特率生成器 ...

  5. 剑指offer——17数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.   保证base和exponent不同时为0   一般解法: 直接相乘: cl ...

  6. Netty环境安装配置

    本章中介绍的Netty开发环境的安装及配置; 这个一系列教程示例的Netty最低要求只有两个:最新版本的Netty 4.x和JDK 1.6及更高版本. 最新版本的Netty在项目下载页面中可找到:ht ...

  7. 03、request 模块高级

    requests高级部分 代理 cookie 验证码的识别 模拟登陆 代理 代理概念:代理服务器. 作用:接受请求==>请求转发. 代理和爬虫之间的关联: 可以使用请求转发的机制使得目的服务器接 ...

  8. 17-Ubuntu-文件和目录命令-切换目录-相对路径和绝对路径

    1.相对路径: 在输入路径时,最前面不是/或者~,表示相对当前目录所在的目录位置. 例:当前桌面目录下,通过相对路径切换到桌面目录下的Entertainment目录 2.绝对路径: 在输入路径时,最前 ...

  9. 【python】遇到的错误

    呃.这学期在学python啦.之前虽然自学过,但都是跟着教程也没使用什么编译环境.没遇到奇奇怪怪的错误. 现在就当作一个记录贴吧. 用的编译工具是pycharm.电脑是MacBook Air 1.我在 ...

  10. Java基础知识之常见关键字以及概念总结

    static 特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 使用注意: 静态方法只能访问静态成员 但是非静态成员可以直接访问静态成员 静态方法中不可用使用this, ...