首页 > 其他分享 >一般图的支配树

一般图的支配树

时间:2024-05-23 17:42:44浏览次数:22  
标签:sdom 支配 int DFS 一般 operatorname idom

P5180【模板】支配树

来咯,我们来说说一般图上的支配树。

(前排提醒:本文实质是对老师讲的内容的补充,阅读本文前应该知道 \(\operatorname{idom}\) 及其在 DAG 上的求解方法,具体可以去查看 ZJOI2012 灾难 的题解。)

常见的做法是 Languaer-Tarjan 算法,该算法的核心在于提出了半支配点 \(\text{sdom}\)。

半支配点 \(\operatorname{sdom}\) 的定义是除起点和终点外只经过 DFS 序大于终点的点的起点中 DFS 序最小的一个。

形式化说,将点按照 DFS 序编号后,\(\operatorname{sdom }x=\min\{v\mid\exist v=v_0\rightarrow v_1\rightarrow\cdots\rightarrow v_k=x,\forall 1\le i\lt k,v_i\gt x\}\)。

(渲染问题,\(\exist\) 是存在的意思,懒得改了将就看。)

这里在本文中额外定义 半支配 关系,即满足上述条件,但不一定是最小值的那些 \(v\) 都是 半支配 \(x\) 的,当然 \(\operatorname{sdom }x\) 也 半支配 \(x\)。

这东西看上去屁点性质没有,先不说怎么拿它求答案,根本就求不出来吧?

先暴力考虑怎么求解 \(\operatorname{sdom}\) 吧,下面点的编号即为其 DFS 序。

对于一个点 \(u\) 进行求解,则考虑其前驱 \(v\),分类讨论答案的候选值:

  • \(v\lt u\),此时 \(v\) 就直接小于 \(u\) 了,显然只能拿 \(v\) 作为起点,所以 \(v\) 是当前情况唯一可能的候选值,另外其实这种情况只有可能在 \(v\) 是 \(u\) 在 DFS 树上的父亲时成立。
  • \(v\gt u\),这个时候 \(v\) 可以作为路径中间的点,于是 \(\operatorname{sdom }v\) 是一个候选值,而此时 \(v\) 可以继续往 DFS 树的父亲走,如果其父亲 \(w\gt u\),这个过程就还能够继续,直到发现 \(w\lt u\) 的时候变成第一种情况为止。

容易发现上面的部分没有漏掉任何一个可能的候选值,这时候做一个暴力从所有候选值中取最小值即可。

发现时间复杂度的瓶颈位于第二种情况,有什么办法优化一下?

考虑按照 DFS 序的逆序 处理。

此时已经处理的点天然满足大于的条件,因此我们可以把第二种情况查询的信息简化为 \(v\) 上面所有已经完成更新的祖先的 \(\operatorname{sdom}\) 的最小值。

注意到维护的信息非常简单,我们可以使用带权并查集简单维护,注意这里不能按秩合并,因为我们的并查集维护的是处理到目前的 DFS 树,形态不能够变。

此时我们能够处理出所有点的 \(\operatorname{sdom}\) 了,时间复杂度为 \(\mathcal{O}(n\log n)\)。

不过就算知道了 \(\operatorname{sdom}\) 又有啥用啊真的是……

我们最终要求的是 \(\operatorname{idom}\) 啊,这个 \(\operatorname{sdom}\) 和它有啥关系嘛……

分析一下,关于 \(\operatorname{idom }x\) 有一个性质,即 \(\operatorname{idom }x\) 一定在 DFS 树上根节点到 \(x\) 的路径上,考虑 \(\operatorname{idom}\) 的定义就可以得到。

而 \(\operatorname{sdom}\) 很显然告诉我们,\(\operatorname{sdom }x\) 子树内的点(不包括它)都不可能成为 \(\operatorname{idom }x\),因为这里存在一条其它的路径不经过它们。

这下 \(\operatorname{sdom}\) 看上去有用了,分析一下怎样求解?

(只说 DAG 做法,另一个我太烂了不会。)

我们往已有的做法上靠,就是 DAG 上的做法,能不能把原图换成一个支配关系相同的 DAG?

要这么做肯定不能虚空建图,我们考虑保留一点原图的元素。

分析一下,我们可以留下 DFS 树,这样子原有的支配关系全部都在,只是多出了一些本来没有的支配关系。

考虑去掉多余的支配关系,设原本不满足支配关系的点对 \(u,v\),其中 \(u\) 不支配 \(v\)。

现在这个点对满足支配关系,我们可以推出 \(u\) 是 \(v\) 的祖先(\(u\) 是 \(v\) 的情况就不讨论了)。

如果 \(u\) 原本不支配 \(v\),则存在一条路径不经过 \(u\) 到达 \(v\),我们分析一下这条路径什么情况。

挂一张图(还没画):

我们可以考虑根节点到 \(v\) 的这条路径,上面必然经过点 \(u\)。

而显然如果要不经过 \(u\) 到 \(v\),必然有两个点 \(x,y\) 满足 \(x\) 能够到达 \(y\) 且 \(x\) 是 \(u\) 的祖先,\(u\) 是 \(y\) 的祖先。

不难发现 \(y\) 一定是通过某条横叉边到达的,由于这是有向图的 DFS 树,所以横叉边一定是由 DFS 序大的点连向小的点的。

容易推出 \(x\) 到 \(y\) 的路径上所有点的 DFS 序均大于 \(y\),所以 \(x\) 半支配 \(y\)。

显然我们连接 \(x,y\) 即可去掉 \(u,v\) 中多余的支配关系,而连接 \(\operatorname{sdom }y,y\) 显然也能够达成一致的效果,因为 \(\operatorname{sdom }x\) 是所有 半支配 \(x\) 的点中深度最浅的那个。

此时没有多余的支配关系了,又因为 \(\operatorname{idom }x\) 是 \(\operatorname{sdom }x\) 的祖先,所以支配关系不会因为这样的操作变少。

不难发现新图是 DAG,于是我们完成了一般图的支配树的求解。

挂个代码吧,没什么参考作用。

#include<bits/stdc++.h>
using namespace std;
constexpr int N=200010;
vector<int>G[2][N],e[N],T[N];
int dfn[N],rev[N],tot,fa[N];
void dfs1(int u)
{
	tot++;
	dfn[u]=tot;
	rev[tot]=u;
	for(int v:G[0][u])if(!dfn[v])dfs1(v),fa[v]=u,e[v].push_back(u);
	return;
}
int dsu[N],val[N],sdom[N];
pair<int,int>F(int x)
{
	if(dsu[x]==x)return make_pair(x,sdom[x]);
	pair<int,int>tmp=F(dsu[x]);
	val[x]=min(val[x],tmp.second);
	dsu[x]=tmp.first;
	return make_pair(dsu[x],val[x]);
}
constexpr int MX=15;
int f[N][MX],d[N];
inline int LCA(int u,int v)
{
	if(d[u]<d[v])swap(u,v);
	for(int i=MX-1;i>=0;i--)if(d[f[u][i]]>=d[v])u=f[u][i];
	if(u==v)return u;
	for(int i=MX-1;i>=0;i--)if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];
	return f[v][0];
}
int sz[N];
void dfs2(int u)
{
	sz[u]=1;
	for(int v:T[u])if(!sz[v])dfs2(v),sz[u]+=sz[v];
	return;
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		G[0][a].push_back(b);
		G[1][b].push_back(a);
	}
	dfs1(1);
	iota(dsu+1,dsu+n+1,1);
	memset(val,0x7f,sizeof val);
	swap(n,tot);
	for(int i=n;i>1;i--)
	{
		int u=rev[i];
		sdom[u]=n+1;
		for(int v:G[1][u])
		{
			if(dfn[v]<i)sdom[u]=min(sdom[u],dfn[v]);
			else sdom[u]=min(sdom[u],F(v).second);
		}
		for(int v:G[0][u])if(fa[v]==u)dsu[v]=u,val[v]=sdom[v];
	}
	for(int i=2;i<=n;i++)sdom[i]=rev[sdom[i]];
	for(int i=2;i<=n;i++)e[i].push_back(sdom[i]);
	d[1]=1;
	for(int i=2;i<=n;i++)
	{
		int u=rev[i];
		int idom=-1;
		for(int v:e[u])
		{
			if(idom==-1)idom=v;
			else idom=LCA(idom,v);
		}
		f[u][0]=idom;
		d[u]=d[idom]+1;
		for(int i=1;i<MX;i++)f[u][i]=f[f[u][i-1]][i-1];
		T[idom].push_back(u);
	}
	dfs2(1);
	printf("%d",n);
	for(int i=2;i<=tot;i++)printf(" %d",sz[i]==0?1:sz[i]);
	return 0;
}

标签:sdom,支配,int,DFS,一般,operatorname,idom
From: https://www.cnblogs.com/XiaoShanYunPan/p/18209054

相关文章

  • 组策略-处理-一般过程
    一:[处理间隔][计算机策略]于[Windows启动时]触发处理,[用户策略]于[用户登陆时]触发处理。-->此处理方式称之为[前台处理(foregroundprocess)]。默认情况下,成员计算机90~120分钟间隔再次触发处理,域控则每5分钟触发一次处理。-->此处理方式称之为[后台处理(back......
  • 一般显卡3d建模渲染够用吗?3d云渲染助力
    3D建模和渲染对计算机硬件有较高要求,特别是显卡。显卡的性能直接影响渲染速度,低端和高端显卡在渲染效率上存在显著差异。对于追求快速渲染的用户,高端显卡是首选。那么,4050显卡是否能够满足3D建模渲染的需求呢?下面我们来探讨这个问题。一、显卡性能对3D建模和渲染的影响显卡在3......
  • 0505一般质疑
    一般质疑底层逻辑质疑方式无论据有结论A和非A的矛盾有理由的得出相反的结论有论据有结论--近似看成A=》B-和A且非B矛盾绝大多数肯定论据得出相反结论--得不出该结论......
  • 实际项目中一般使用到的git知识
    1.项目上线分支管理流程图片压缩太厉害有些模糊700k压缩到20多k清晰些的图片地址https://project.zdzspace.cn/test-vuekey2.一些常用的git命令gitfetch拉取远程仓库最新代码但是不合并到本地分支gitmergefeature-a用于合并本地分支feature-a到当前分支常用gti......
  • 找汽车之家打广告一般需要多少钱?CloudKOL为您准备1000+汽车自媒体资源
    CloudKOL汽车自媒体广告投放价格指南汽车之家作为国内知名的汽车资讯平台之一,拥有大量的汽车爱好者和潜在消费者用户群体,是众多汽车品牌进行广告投放的首选平台之一。在进行广告投放前,了解汽车之家广告投放的价格是非常重要的。下面是CloudKOL为您准备的汽车之家广告投放价格......
  • 一篇SCI论文一般多少字?
    1、一篇SCI投稿论文的具体字数,要根据刊物要求来定,不同的刊物之间,有些差别还是很大的,有的3-5千字左右,有的好几万字左右。一般来说,一篇SCI论文大概在3-5个版面左右。其次,发表一篇SCI投稿论文,并不是长篇大论,要把论文论点精简到位、观点明确,内容要切中要点,详略得当,只要把科研成果介......
  • USACO 2008 Jan G]Cell Phone Network 最小支配集(最小覆盖集)
    题目描述FarmerJohnhasdecidedtogiveeachofhiscowsacellphoneinhopestoencouragetheirsocialinteraction.This,however,requireshimtosetupcellphonetowersonhisN(1≤N≤10,000)pastures(convenientlynumbered1..N)sotheycanal......
  • Redis 一般有哪些使用场景?
    热点数据的缓存缓存是Redis最常见的应用场景,之所有这么使用,主要是因为Redis读写性能优异。而且逐渐有取代memcached,成为首选服务端缓存的组件。而且,Redis内部是支持事务的,在使用时候能有效保证数据的一致性。限时业务的运用redis中可以使用expire命令设置一个键的生存时间,......
  • 身份证实名认证接口的价格一般是多少呢?基于PHP身份核验接口
    身份证实名认证接口分为身份证二要素、三要素、三要素+人像核验接口,被广泛的应用于婚恋、交友、电商等等一系列行业领域,身份证实名认证需要实时数据,对于数据源来说也需要可靠,那么,身份证实名认证的价格是不是很贵呢?以翔云身份证实名认证二要素接口为例,是按照二要素核验进......
  • 软考-系统集成项目管理中级-项目管理一般知识
    本章历年考题分值统计本章重点常考知识点汇总清单(学握部分可直接理解记忆)项目型组织的优点体现在如下方面:本章历年考题及答案解析2019年上半年第29题(此题为常规重点考题,建议举一反三)在(29)组织结构中,项目拥有独立的项目团队,项目经理在调用与项目相关的资源时,......