图联通
7/11
PRO-Professor Szu
题意:
给定有向图,有重边有自环,从 \(1 \sim n\) 中而每个点出发到达 \(n+1\) 不同的路径数,问那些点的路径数最多(重边算不同边,自环算不同点)。如果路径数大于36500,输出"zawsze"。
先缩点,再拓扑。设 \(f_{u}\) 为这个强连通分量里的点的答案,如果强连通分量里的点多于 \(1\) 就使得 $f_{u}=\infty $ ,正常的用 \(f_{v} + = f_{u}\) 即可。
[POI2008] BLO-Blockade
题意:
给定一张无向图,求每个点被封锁之后有多少个有序点对 \((x,y)\) 满足 \(x\) 无法到达 \(y\)。
\(n \le 10^{5}\)
\(m \le 5 \times 10^{5}\)
题意即是找一个点对于多少路径是必走点,那么建立圆方树,方点不算在 \(siz\) 里,那么在这颗树上做简单 \(dp\) 即可。
$ans_{u} = (n-1)\times 2 +\sum_{v\in nxt_{u}}^{} (n-siz[v]-1)*(siz[v]) $
上述式子默认 \(u\) 为根,直接做换根即可。
[APIO2018] 铁人两项
题意:
给定一个 \(n\) 个点 \(m\) 条边的无向图,问有多少三元有序组 \((s,c,f)\) 使得路径 \(s->c->f\) 可以不经过重复的点。
\(n \le 10^{5}\)
\(m \le 2 \times 10^{5}\)
在无向图中,如果三个点在同一个点双,那么一定有不会重复的路径。建立圆方树,以每个点为 \(c\) 来进行 \(DP\),方点不算在 \(siz\) 里,设 \(d_{u}\)为方点的点双大小,即方点的度数,那么可以得到下面转移方程:
对于圆点:$f_{u} = \sum_{v\in nxt_{u}}^{} (n-siz[v]-1)*(siz[v]) $
对于方点:\(f_{u} = (d_{u}-2)*\sum_{v\in nxt_{u}}^{} (n-siz[v])*(siz[v])\)
Tourists
题意:
给定一个 \(n\) 个点 \(m\) 条边的有点权的无向图,有 \(q\) 次操作。
操作一,改变点 \(x\) 的点权为 \(y\)。
操作二,设 \(w\) 为从 \(x\) 到 \(y\) 的一条路径上最小点权值,问 \(w\)在所有可能的路径中的最小值是多少。
\(n,m,q\le10^{5}\)
所有可能路径的点权最小值,这就很圆方树。建完圆方树,对于查询,我们只要在树上树剖就行,但是假设我们用只是用 \(set\) 来维护一个方点的最小值,将所连的所有圆点的值都塞入这个 \(set\) 里,然后在 \(set\) 里取最小,那么修改一个点时可能要把 \(O(n)\) 级别的方点修改,总时间就到 \(O(n^{2})\) 了。
我们考虑在树上,每个节点都只有一个父亲,我们把对于一个圆点,只把他的值塞到他父亲方点上去,那么我们查询时,除了 \(lca\) 上的点,其他点的值一定与之前的做法一样,然后如果 \(lca\) 是方点,那就再去找 \(lca\) 的父亲取 \(min\) 即可。
[SDOI2018] 战略游戏
题意:
给定 \(n\) 个点 \(m\) 条边的无向图,有 \(q\) 个询问,每次询问选定 \(x\) 个点,问在图上有多少个非选定点,使得至少有一对选定点间的路径必须经过这个点。
$ n,q \le 10^{5} $
$ m \le 2 \times 10^{5} $
如果两个点在一个点双中,那么删去任意一个点都是联通的,那么我们建立圆方树,那么我们只要求出包含所有选中点的最小联通块的圆点数 \(-\) 选中点个数即可。
考虑如何快速求出这个联通块大小,我们知道联通块大小为边数减一,我们可以先求出边数,而我们先将选中点按照 \(dfs\) 序排序,那么从第一个点触发一次遍历相邻两个点,再回到第一个点,这样每条边都走了两遍,就得到了边数。
但是圆点是不算大小的,如果求边数,那么就要把圆点数也求出来,但是我们可以将点权挂到边上,那么我们照样统计就可以得到 圆点数 \(\times 2\) 的数了,注意,这个联通块的根(也就是第一个点和最后一个点的 \(lca\) )在统计时没被统计进去,要特判加上。
Caterpillar
题意:
给定一个 \(n\) 个点 \(m\) 条边的无向图,求最小的合并次数使得图变成毛毛虫图。
毛毛虫图为存在一条链使得所有点与链上点的距离不超过一的无向联通无环图。
合并为将两个点删除,新增一个点,将左右与两个点相关的边都连到新增点上。
$n \le 2000 $
$ m \le 10^{5}$
如果是存在一个环,那么必然这个环要合并成一点,那么我们进行边双缩点,由于图不联通,就是个森林,对于一棵树,我们可以保证对于不在最后的链上的点,最优方案一定是把所有叶子都保留,然后我们只要将链尽量长就行,就是找直径。假设直径长为 \(x\) ,叶子数为 \(y\) ,那么一棵树要进行的合并次数为 $ n - (x+y-2)$。然后每颗树合并即可。

浙公网安备 33010602011771号