伪目录

  1. 给出支配树的定义
  2. 给出一些性质
  3. 介绍快速构造支配树的Lengauer-Tarjan算法及具体实现

支配树是啥

一个有源点的有向图,其支配树是满足下面条件的一个有向图:

对于支配树上一点,若断开此点,则源点必定不能到达它的任何儿子,并且能到达其他任意一个点。

不显然的,它是一棵树(当然后面会有证明)

支配树有很多实际用途,我都不知道。

一些性质

对于一个有向图,假设源点为rrr,先从rrr出发构造一棵dfs树。

定义:对于一个点uuu,若一支配uuu的点www满足w̸=uw\not= uw̸​=u并且www被支配uuu的其他不含uuu的支配点支配,则www就是uuu的最近支配点,记作idom(u)idom(u)idom(u)。

通俗的讲,www是离uuu最近的那个支配点,并且能恰好支配uuu。

Lemma 1: 支配关系不存在环。

Proof: 若aaa支配bbb,那么rrr到bbb必定经过aaa,若bbb支配aaa则到达bbb需要经过aaa,此时并没有经过bbb,产生矛盾。

Lemma 2: 除源点外,其他点有且仅有一个最近支配点。

Proof: 若aaa支配bbb,bbb支配ccc,则aaa支配ccc;若aaa支配ccc,bbb支配ccc,那么aaa支配bbb或bbb支配aaa,否则可以找到一条路径不经过aaa而到达ccc而矛盾。因此支配uuu的所有点的集合构成了一个全序关系,因此总可以找到一个点满足上述最近支配点的定义。

Theorem 1: 若连接一个点和其最近支配点,那么这张图构成了一棵树,并且满足支配树的定义。

Proof: 由Lemma 1和Lemma 2可以得到这张图就是一棵树。容易证明,若断开uuu,则源点不可能到达uuu的任意一个儿子。对于其他点,由支配树的定义和Lemma 2可以推导出这个点不会受到uuu是否断开的影响。

由Theorem 1,若得到了所有点的idomidomidom,则容易构造出这张图的支配树。

那么怎么求idomidomidom呢?

首先定义:定义一个点uuu的半支配点www为存在路径w→uw\rightarrow uw→u,使得除了www,这条路径上任意一个点的dfs序都大于等于uuu的dfs序,并且www是所有满足条件的点中最小的那个,记作sdom(u)sdom(u)sdom(u)。

Lemma 3: 对于任意一点u̸=ru\not=ru̸​=r,idom(u)idom(u)idom(u)为uuu在dfs树上的祖先。

Proof: 若不是祖先,则可以找到一条只经过树边的路径,必定不经过idom(u)idom(u)idom(u)。

Lemma 4: 对于任意一点u̸=ru\not=ru̸​=r,sdom(u)sdom(u)sdom(u)为uuu在dfs树上的祖先。

Proof: 若不是祖先,若其dfs序小于uuu的dfs序,则dfs时必定会经过sdom(u)sdom(u)sdom(u)而到达uuu,此时sdom(u)sdom(u)sdom(u)就是uuu的祖先,产生矛盾;否则,则可以找到一个点www为sdom(u)sdom(u)sdom(u)在dfs树上的祖先,路径w→sdom(u)→uw\rightarrow sdom(u)\rightarrow uw→sdom(u)→u是一条满足定义的路径,并且www的dfs序小于sdom(u)sdom(u)sdom(u)的dfs序,产生矛盾。

Lemma 5: 对于任意一点u̸=ru\not=ru̸​=r,idom(u)idom(u)idom(u)为sdom(u)sdom(u)sdom(u)在dfs树上的祖先。

Proof: 若不是祖先,则可以找到一条r→sdom(u)→ur\rightarrow sdom(u)\rightarrow ur→sdom(u)→u的路径,其中r→sdom(u)r\rightarrow sdom(u)r→sdom(u)经过dfs树边,显然不经过idom(u)idom(u)idom(u);sdom(u)→usdom(u)\rightarrow usdom(u)→u这段路径上任意一个点的dfs序大于uuu,由于Lemma 3,这段路径也不经过idom(u)idom(u)idom(u),因此找到了一条路径可以绕过idom(u)idom(u)idom(u),产生矛盾。

Lemma 6: 对于任意两点u̸=r,v̸=ru\not=r,v\not=ru̸​=r,v̸​=r,若uuu是vvv的祖先,则uuu是idom(v)idom(v)idom(v)的祖先或idom(v)idom(v)idom(v)是idom(u)idom(u)idom(u)的祖先(上面两种情况都可以相等)。

Proof: 否则idom(u)idom(u)idom(u)是idom(v)idom(v)idom(v)的祖先,idom(v)idom(v)idom(v)是uuu的祖先,那么存在一条路径能绕过idom(v)idom(v)idom(v)而到达uuu进而到达vvv,产生矛盾。

Theorem 2: 对于任意一点u̸=ru\not=ru̸​=r,若sdom(u)→usdom(u)\rightarrow usdom(u)→u只经过树边的路径上,不包括sdom(u)sdom(u)sdom(u)的任意一点vvv都满足sdom(u)sdom(u)sdom(u)是sdom(v)sdom(v)sdom(v)的祖先或二者相等,则idom(u)=sdom(u)idom(u)=sdom(u)idom(u)=sdom(u)。

Proof: 由Lemma 5,若sdom(u)sdom(u)sdom(u)支配uuu,则idom(u)=sdom(u)idom(u)=sdom(u)idom(u)=sdom(u)。对r→ur\rightarrow ur→u的任意一条路径,取dfs序最大的点www满足www是sdom(u)sdom(u)sdom(u)的祖先;取dfs序最小的点xxx,满足sdom(u)sdom(u)sdom(u)是xxx的祖先或二者相等,容易发现这样的点必定存在。那么sdom(x)sdom(x)sdom(x)的就是www,但是www是sdom(u)sdom(u)sdom(u)的祖先,因此x=sdom(u)x=sdom(u)x=sdom(u),那么任何r→ur\rightarrow ur→u的路径必定经过sdom(u)sdom(u)sdom(u),因此sdom(u)sdom(u)sdom(u)支配uuu。

Theorem 3: 对于任意一点u̸=ru\not=ru̸​=r,若sdom(u)→usdom(u)\rightarrow usdom(u)→u只经过树边的路径上,不包括sdom(u)sdom(u)sdom(u)的点中,对于sdom(v)sdom(v)sdom(v)的dfs序最小的vvv,满足sdom(v)sdom(v)sdom(v)是sdom(u)sdom(u)sdom(u)的祖先,那么idom(u)=idom(v)idom(u)=idom(v)idom(u)=idom(v)。

Proof: 由Lemma 5和Lemma 6,idom(u)idom(u)idom(u)是idom(v)idom(v)idom(v)的祖先或二者相等。因此只要证明idom(v)idom(v)idom(v)支配uuu即可。类似Theorem 2的证明,取www为idom(v)idom(v)idom(v)的祖先,xxx为idom(v)idom(v)idom(v)的后代或二者相等,那么sdom(x)sdom(x)sdom(x)为www,又由于sdom(v)sdom(v)sdom(v)是最大的,因此xxx不可能是sdom(u)sdom(u)sdom(u)的后代;若xxx是sdom(u)sdom(u)sdom(u)的祖先或相等,但是是idom(v)idom(v)idom(v)的后代,那么就找到了一条绕过idom(v)idom(v)idom(v)而到达vvv的路径。因此xxx就是idom(v)idom(v)idom(v)。那么所有路径都经过idom(v)idom(v)idom(v),因此idom(v)idom(v)idom(v)支配uuu。

由Theorem 2和Theorem 3,我们可以轻松的由sdomsdomsdom求出idomidomidom了。

Theorem 4: 对于任意一点u̸=ru\not= ru̸​=r,sdom(u)sdom(u)sdom(u)是满足下列条件两条件的dfs序最小的xxx:1. 存在一条边x→ux\rightarrow ux→u且xxx的dfs序小于uuu的dfs序;2. x=sdom(v)x=sdom(v)x=sdom(v),vvv的dfs序大于uuu的dfs序,并且存在一个点www满足存在一条边w→uw\rightarrow uw→u且vvv是www的祖先或相等。

Proof: 显然对于每一个xxx,都存在一条满足sdomsdomsdom要求的路径。由于sdom(u)sdom(u)sdom(u)后面的点dfs序一定大于等于uuu,取sdom(u)sdom(u)sdom(u)的后面一个点vvv,那么sdom(v)sdom(v)sdom(v)的dfs序必定等于sdom(u)sdom(u)sdom(u),并且vvv符合上述条件。

由Theorem 4可以很方便的求出sdomsdomsdom。

具体实现

以dfs序的倒序枚举每个点,假设有一个数据结构,支持:将一个点作为另外一个点的父亲;查询这个点到根的sdomsdomsdom最小值。

设当前枚举的点为uuu,可以枚举uuu的前驱xxx,那么sdom(u)sdom(u)sdom(u)就是uuu的前驱在数据结构上的sdomsdomsdom最小值的最小值。

对于uuu的父亲ttt,每个sdom(w)=tsdom(w)=tsdom(w)=t并且www是uuu的后代或二者相等的www在数据结构上的sdomsdomsdom最小值就是Theorem 2和Theorem 3描述的最小值,直接更新www的idomidomidom即可。

注意Theorem 3中vvv的idomidomidom可能还没有被更新,那么暂时令idom(w)=vidom(w)=vidom(w)=v,之后若idom(w)̸=sdom(w)idom(w)\not=sdom(w)idom(w)̸​=sdom(w)就更新成idom(idom(w))idom(idom(w))idom(idom(w))。

数据结构可以采用带权并查集,时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)

代码

//dfn[i]为i的dfs序,idfn[i]是dfs序为i的点,het[i]是i的所有前驱,bkt[i]是所有sdom为i的点
//eval(i)为找到并查集中这个点到父亲的sdom中dfs序最小的那个
int getidom()
{for(int i=cnt; i>1; --i){int u=idfn[i];for(int v:het[u]){if(!dfn[v]){continue;}int w=eval(v);if(dfn[sdom[w]]<dfn[sdom[u]]){sdom[u]=sdom[w];}}bkt[sdom[u]].push_back(u);int t=fa[u];dsu::fa[u]=t;for(int v:bkt[t]){int w=eval(v);idom[v]=(sdom[w]==sdom[v])?t:w;}bkt[t].clear();}for(int i=2; i<=cnt; ++i){int u=idfn[i];idom[u]=(idom[u]==sdom[u])?(idom[u]):(idom[idom[u]]);}return 0;
}

转载于:https://www.cnblogs.com/Canopus-wym/p/10376054.html

支配树与Lengauer-Tarjan算法相关推荐

  1. LCA 朴素算法+树差分倍增+Tarjan算法 三种算法实现c++代码实现

    哔哩哔哩up视频:https://www.bilibili.com/video/BV1nE411L7rz?t=379 转载:http 文章目录 树差分 & 倍增LCA Tarjan 朴素算法 ...

  2. 支配树(洛谷-P5180)

    题目描述 给定一张有向图,求从1号点出发,每个点能支配的点的个数(包括自己) 输入输出格式 输入格式: 第一行两个正整数n,mn,m,表示点数和边数 接下来mm行,每行输入两个整数u,vu,v,表示有 ...

  3. 有向图的必经点,支配树

    支配树的背景 流程图 食物链 GC 场景 DAG 上求支配树 树上倍增 模板: P2597 灾难 一般有向图上求支配树 Lengauer-Tarjan 算法 模板: P5180 [模板]支配树 $0 ...

  4. HDU 4694: Important Sisters(支配树)

    题意: 御坂和她的n-1个克隆姐姐(编号1~n-1)构成一张御坂网络,如果第x号"姐姐"和第y号"姐姐"有条x到y的有向边,则说明x可以将信息传给y,已知御坂妹 ...

  5. Lengauer-Tarjan算法--支配树构造(bzoj 2815: [ZJOI2012]灾难)

    模型: 一个有向图G,设定一个点r,要求点r能到达G中所有的点,如果这样的点不存在,新建并向所有入度为0的点连边 支配点: 对于点u,如果在删掉点p之后,r不能到达u,那么称p(p!=u)点是u点的一 ...

  6. 【学习小记】支配树【图论】

    Preface 给定一个有向图和一个起点 s t st st,我们需要知道起点到某个点的关于必经点的信息. 若起点到点v的所有路径均经过点u,则我们称点u支配点v,显然一个点支配自己本身 顾名思义,支 ...

  7. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  8. 0x66.图论 - Tarjan算法与无向图连通性

    目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...

  9. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

最新文章

  1. ASP.NET弹出窗口技术之增加网站流量方法
  2. 后台开发经典书籍--计算机网络
  3. Mysql创建、删除用户
  4. 解决HBase RegionServer进程还在,但是显示已经dead了
  5. ARM 之四 各集成开发环境(IDE)说明(Keil、RVDS、ADS、DS-5、MDK)
  6. Heka:Go编写,来自Mozilla,高效、灵活的插件式数据挖掘工具(转)
  7. ubuntu下定时任务的执行
  8. html弹性盒子自适应比例,CCS弹性盒子中间自适应怎么设置
  9. 如何爬取ajax实时加载多个ts文件的视频
  10. 重定向ISA日志到SQL2000
  11. 中国剩余定理----51nod1079
  12. springboot 指定 logback_Spring Boot日志框架实战解析
  13. java程序cpu占用率高,分析具体线程
  14. ios11 mjrefresh 上拉加载更多怎么停不下来了??
  15. React使用高德地图
  16. onedrive电脑手机不同步_关于OneDrive,移动端同步以及显示不及时的问题。
  17. 四超多强 一文看懂中国CV独角兽格局
  18. BOM:window对象的方法之定时器setTimeout()和停止setTimeout()定时器
  19. 【GIS开发】地理编码服务Geocoder(Python)
  20. MySQL 1054错误 Unknown column .... in 'on clause'

热门文章

  1. 离散数学模拟微信红包算法升级版
  2. android 滤镜 原理,android openglse实现滤镜九宫格
  3. java graphics2d 画圆_java Graphics2D 画图
  4. VS Code 报错 local-server-1> ssh child died, shutting down解决方法
  5. 基于E4A的蓝牙APP
  6. 流程图中省略的图表怎么表示_如何将流程图和图表添加到Google文档或幻灯片
  7. GBase 8c数据库登陆
  8. 51nod-1423 最大二“货”(单调栈)
  9. 阶梯博弈(Staircase Nim)
  10. PCL点云库(2) — IO模块