Maybe something w|

Semorius

园龄:1年9个月粉丝:4关注:10

7.11 图联通

传送门

P3436 [POI2006] PRO-Professor Szu

题意描述不太清楚,就算到达 n 可绕一圈再回来,且数据里图不连通。考虑先求出强连通分量,缩完点后建反图在 DAG 上跑 dp 计数,注意只记那些从 n 点开始可达的,如果路径上有一个强连通分量里有边,意味着可以在这个强连通分量里反复走环,它及它的后继都是 inf。(输出方案时的点是原图中的,而非缩完点后的)

[ARC092F] Two Faced Edges

求强连通分量,缩点。考虑缩点后 DAG 上一条边 vu,翻转后强连通分量个数只能减少,且当且仅当 vu 还有一条不经过这个边的路径,以每一个点为起点做一遍拓扑 O(n×(n+m)) 求出。而对于一个强连通分量里的边 vu,翻转后改变数量当且仅当 vuvu 的必经边。考虑怎么求,以每个点为起点顺序枚举它的出边(编号为 1k),dfs 到每个点记录第一次到该点时来源的起点出边编号,再倒序枚举一次起点出边做一遍 dfs,若两次起点 vu 的出边编号相同,则该边为必经边,复杂度同样为O(n×(n+m))

P3469 [POI2008] BLO-Blockade

自然可以建圆方树做,但没必要。如果删的不是割点,答案一定是 (n1)×2,如果是割点,设分割出的子树集合是 S,那么答案是 S 中的子树大小两两相乘再加 (n1)×2,化简以后是 n21iSsizei2。考虑 tarjan 走的是一颗搜索树,可以在 tarjan 过程中顺便求。

P2860 [USACO06JAN] Redundant Paths G

对于割边两端的点势必只有一条路径。先求边双,缩点后变为一棵树。结论是树上度数为 1 的点的个数除以 2 向上取整。

证明:设度数为 1 的点的集合为 S, 若 |S| 为偶数,最后连的边数为 |S|2,即两个一组对应连边,每次连完边后重新缩点度数为 1 的点减少 2,如果一次连边后度数只减少 1,对应的情况只能是一个度数为 3 的点下连 2 条链和一棵子树,连了 2 条链的端点,这时只要任选一条链的端点与那棵子树中的一个度数为 1 的点连就可避免这种情况。若 |S| 为奇数,任选一个度数为 1 的点连边转化为 |S| 为偶数的情况。

CF51F Caterpillar

shaber 翻译

一开始看翻译数据范围 n20000,很奇怪,但自信 O(n),快写完时wy提醒我是 n2000,瞬间破防。但自信写完交,发现直接找直径会漏掉有很多条直径的情况,瞬间破防。

发现答案分为 3 部分,把所有连通块连在一起,把边双缩成一个点,把挂在直径上的树缩到直径上。但 O(n2) 我不会啊,充分利用人类智慧,随机几条直径跑,事实证明正确率非常高。

后来发现确实可以 O(n),子树缩到直径上的代价是 sizicnti,其中 sizi 为子树大小,cnti 为子树中叶子节点个数。发现这个东西整体考虑非常好求,只跟直径长短和叶子个数有关。

P4606 [SDOI2018] 战略游戏

摧毁的点一定得是割点,否则图还联通。并且摧毁这个点后标记点应在不同的连通块里。这个问题在原图上不好做,求完点双缩点后每次要找标记点在哪个点双里,也比较复杂,于是考虑建圆方树。答案便是圆方树上标记点组成的连通块中圆点个数减去标记点个数。这时候可以一棵虚树直接拍上去,但码量太大了,想一想有没有智慧一点的方法。发现把标记点(假设有 k 个)按 dfs 序排序,每次在相邻两点间(包括第 1 个点和第 k 个点)的路径边上加 1,最后可以发现每条边恰经过两次,由于要求圆点个数,可以把圆方树上圆点到父亲的边边权赋为 1,方点到父亲的边边权赋为 0,根是圆点要特判加上 2

CF487E Tourists

建圆方树,每个方点上开一个 multiset,由于圆方树是一棵非常好的树,每个 multiset 里存方点的儿子们的值,每次查两点间路径就能覆盖到所有经过的圆点,除了当 lca 为方点时,要加上方点的父亲(没记录进去的的圆点)。在圆方树上树剖实现修改、查询。

本文作者:Semorius

本文链接:https://www.cnblogs.com/Semorius/p/17573121.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Semorius  阅读(15)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起