tarjan相关,dfs树,点双树,边双树,支配树
yzyyylx
这个作者很懒,什么都没留下…
展开
-
CodeChef - TAPAIR Counting The Important Pairs
题面题意给出一张无向连通图,问去掉两条边后能将其分成多个连通块共有几种方法。做法建出dfs树后,发现一共有三种方法使它被分为多个连通块: 1.这两条边中有至少一条边是桥。 2.这两条边分别是仅被一条返祖边覆盖的树边和覆盖这条树边的返祖边。 3.被相同返祖边覆盖的两条树边。 对于第一种方法,只要统计出树边的数量即可,要注意和第三种方法的重合部分。 对于第二种方法,可...原创 2018-07-11 16:01:32 · 389 阅读 · 0 评论 -
[APIO2018] Duathlon 铁人两项
题面题意给出一张无向图,问有多少组点a,b,c满足存在至少一条从a经过b到c的简单路径。做法首先考虑枚举点a,c,这样每一组a,c对答案的贡献就是可能在ac路径之间出现的点的个数,然后我们可以对图建圆方树,使圆点的点权为-1(去重),方点的点权为点双的大小,这样ac路径之间出现的点的个数就是a,c两点在圆方树上的路径的点权和,然后用树形dp统计每个点对答案的贡献即可。 注...原创 2018-09-04 07:51:03 · 287 阅读 · 0 评论 -
圆方树
解释对每一个点双新建一个方点,由这个方点向点双中的每一个点连一条新边,新边构成的新图即为圆方树,可以发现这张图必然是一棵树(如果原图不连通就是森林)。 可以发现,圆方树中任意两个圆点和任意两个方点之间都没有边。 圆方树可以用于处理图的问题,方点可以用于存储所有与它相连的圆点的信息(有时候存储部分,据题目而定)。代码void dfs(int now){ int p,q,t;...原创 2018-09-03 20:27:47 · 334 阅读 · 0 评论 -
支配树(以HDU4694 Important Sisters为例)
定义在一个流程图(单源有向图)中,如果从源点到某个点p必须要经过某个点q,则q是p的支配点,我们记除了该点自己外,所有支配点中到它最近的点为该点的最近支配点(记为idom),将所有点与它的最近支配点连边构成的树就是支配树。求法对于DAG,非常简单,建出来的支配树也就是灭绝树。 首先建出dfs树,求出每个点的dfs序,之后点的大小比较都根据dfs序。 对于一般流程图则相对复杂,首先定...原创 2018-07-12 19:31:57 · 511 阅读 · 0 评论 -
洛谷 P2597 [ZJOI2012]灾难 灭绝树(支配树)
题面题意给出一张食物网,问当每种生物分别灭绝后会让其他一共几种生物灭绝(没有食物).做法可以发现生物之间的灭局关系会形成一片森林,我们可以用一个根节点将所有树合并成一棵树,也可以理解为新增一种”生物”–太阳,所有生产者会因为它的灭绝而灭绝. 首先对所有生物进行拓扑排序,然后考虑安拓扑序一个一个节点慢慢加入,在加入第i个节点时,不难发现它的所有食物的lca(生产者视为以太阳为食物)到根的这条链上的任原创 2018-04-04 08:32:50 · 475 阅读 · 0 评论 -
边双(以CodeForces - 652E Pursuit For Artifacts为例)
定义若一张连通图中去掉任意一条边后仍然连通,则它是一个边双。求法可以发现,边双中不包含桥,因此将图中的桥去掉之后,剩下的图中的所有连通块都是边双。例题(CodeForces - 652E Pursuit For Artifacts)题意给出一张无向图,一些边上有一个神器,每条边只能经过一次,问,从s走到t,能否顺便拿到至少一个神器。做法可以发现,如...原创 2018-07-11 17:49:54 · 365 阅读 · 0 评论 -
点双(以HDU - 3686 Traffic Real Time Query System为例)
定义一张连通图中,若任意两个点之间都有至少两条没有重复点的路径,则这是一个点双。求法和tarjan系列的算法相似,在建dfs树的同时,可以发现每个割点都会将这个图分为几个点双,且每个割点都属于多个点双,因此,我们可以在dfs的同时,将所经过的边全部存起来,每当扫到一个割点就统计这个割点所分出的点双。代码void dfs(int now){// if(xh>D...原创 2018-07-11 17:23:15 · 385 阅读 · 0 评论 -
tarjan算法求割点
割点 在一张无向图中,如果去掉某一个点后使这张图的连通分量增加,则说明这个点是割点,也就是说去掉这个点后,使原本连通的两块不连通.做法 首先任意找一点为根,以此点开始dfs,对每一个点记录两个值: 1.它是第几个被(首次)访问到的,也就是时间戳.用num表示 2.它不经过父节点所能达到的最小时间戳.用low表示 如果一个点(非根节点)的子节点的low大于等于这个点的时间戳原创 2018-03-05 07:27:51 · 508 阅读 · 0 评论 -
Tarjan求强连通分量,缩点
强连通分量 是指在一张图图中任意两点都可以两两互相到达.作用 在一些问题中因为两两可以互相到达的性质,可以将一个强连通分量当做一个大点来做.Tarjan 与tarjan算法求割点的做法相似,遍历时记录一个时间戳和一个low记录不经过祖先节点可以到达到的时间戳最小的点,遍历时再将扫到的点放入一个栈中,并用一个布尔数组记录这些点. 若时间戳与low相等,则不断pop直到当前点被po原创 2018-03-11 15:35:07 · 323 阅读 · 0 评论 -
Kosaraju求强连通分量,缩点
作用 只要两边dfs,相比于用tarjan求强连通分量,kosaraju算法还可以顺便求出强连通分量的拓扑序,有利于之后的运算.实现方法 首先以任意一点开始dfs,并记录下搜索的后序遍历,之后将所有边反向,每次从没有搜过的点中选择后序遍历最大的搜索,此次搜到的点均与该点属于同一个强连通分量,直到所有点都被搜到过停止,可以发现越先求出的强连通分量,拓扑序越小.例题(poj 2186)题意原创 2018-03-11 19:37:41 · 422 阅读 · 0 评论 -
codeforces1155F Delivery Oligopoly
题面题意给出一张无向图,问至少保留几条边才能使此图是一个边双,并输出方案.做法考虑怎么构造出一个边双,发现可以通过在一个小边双上加一条链,使它变为一个新的大边双,所以可以记f[u][v][i]f[u][v][i]f[u][v][i]表示是否存在一条从u到v的链上包含了状态i的点,然后进行dp,dp[i]dp[i]dp[i]表示状态为i的点组成的边双至少要有几条边,用f数组进行转移即可.代...原创 2019-05-04 19:57:57 · 418 阅读 · 0 评论