[BZOJ4998]星球联盟(LCT,并查集)

发布于 2018-01-21  14 次阅读


本文章由SYCstudio或本站其它作者所有,严禁转载,转载必究

本文链接地址:[BZOJ4998]星球联盟(LCT,并查集)

Description

在遥远的S星系中一共有N个星球,编号为1…N。其中的一些星球决定组成联盟,以方便相互间的交流。但是,组成联盟的首要条件就是交通条件。初始时,在这N个星球间有M条太空隧道。每条太空隧道连接两个星球,使得它们能够相互到达。若两个星球属于同一个联盟,则必须存在一条环形线路经过这两个星球,即两个星球间存在两条没有公共隧道的路径。为了壮大联盟的队伍,这些星球将建设P条新的太空隧道。这P条新隧道将按顺序依次建成。一条新轨道建成后,可能会使一些星球属于同一个联盟。你的任务是计算出,在一条新隧道建设完毕后,判断这条新轨道连接的两个星球是否属于同一个联盟,如果属于同一个联盟就计算出这个联盟中有多少个星球。

Http

BZOJ

Tag

LCT,并查集

题目大意

简单一句话,动态维护边双联通分量

解决思路

在线做法
用并查集1维护连通性,并用LCT维护在同一个联通块(注意这里还不是双联通)的点。
如果遇到加入一条边时,两个端点已经在同一个联通块了,说明新形成了一个双联通分量,找出这两点之间的路径,把这个环缩成一个点(这个用并查集2维护),环上所有点都指向一个编号,\(dfs\)一遍可以遍历所有这些点,把它们的\(size\)累加。
要注意,因为我们有缩点的操作,所以在\(LCT\)的各种操作中都要注意及时\(find\)找到编号。

代码

本文章由SYCstudio或本站其它作者所有,严禁转载,转载必究

本文链接地址:[BZOJ4998]星球联盟(LCT,并查集)


HNCJ OIer 一枚