首页 > 其他分享 >「黑科技」支配树

「黑科技」支配树

时间:2023-07-25 20:57:40浏览次数:34  
标签:sdom 支配 ch int register 科技 include

定义

给定一张有向图与一个起点 \(s\),如果要去掉起点 \(s\) 到某个点 \(v\) 的中间的某个点 \(u\) 后无法到达,那么称点 \(u\) 支配点 \(v\),\(u\) 是 \(v\) 的一个支配点

  • 最近支配点 \((idom[u])\)

\(u\) 的支配点中距离 \(u\) 最近的一点

  • 支配树

由所有边 \(idom[u]\rightarrow u\) 构成的树。在树上,满足:

1、\(u\) 的支配点即为它的所有祖先

2、\(u\) 支配的点数即为其子树大小

即,判断一张有向图中,点 \(u\) 是否支配 \(v\) 时,即可在支配树上判断 \(u\) 是否是 \(v\) 的祖先

下面分为三中情况讨论支配树的构建

显然支配树就是这棵树

DAG

构建 \(DFS\) 树,\(idom[u]\) 即为图中所有一步指向它的点在 \(DFS\) 树上的 \(LCA\)

时间复杂度 \(\mathcal {O} (m\log n)\)

有向图

\(\mathcal {Lengauer\;Tarjan}\) 算法

做法略,证明略,反正我已经打 \(\mathcal {ACM}\) 了,有板子就行了o.O

代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int maxn = 3e5 + 50, INF = 0x3f3f3f3f;

inline int read () {
	register int x = 0, w = 1;
	register char ch = getchar ();
	for (; ch < '0' || ch > '9'; ch = getchar ()) if (ch == '-') w = -1;
	for (; ch >= '0' && ch <= '9'; ch = getchar ()) x = x * 10 + ch - '0';
	return x * w;
}

int n, m;
int ans[maxn];

struct Edge {
	int to, next;
} e[3][maxn];

int tot[3], head[3][maxn];

inline void Add (register int id, register int u, register int v) {
	e[id][++ tot[id]].to = v;
	e[id][tot[id]].next = head[id][u];
	head[id][u] = tot[id];
}

int tic;
int fa[maxn];
int dfn[maxn], rk[maxn];
int sdom[maxn], idom[maxn];
int f[maxn], minn[maxn];

inline int Find (register int u) {
	if (u == f[u]) return u;
	register int rt = Find (f[u]);
	if (dfn[sdom[minn[f[u]]]] < dfn[sdom[minn[u]]])
		minn[u] = minn[f[u]];
	return f[u] = rt;
}

inline void DFS (register int u) {
	dfn[u] = ++ tic, f[u] = minn[u] = sdom[u] = rk[tic] = u;
	for (register int i = head[0][u]; i; i = e[0][i].next) {
		register int v = e[0][i].to;
		if (! dfn[v]) fa[v] = u, DFS (v);
	}
}

inline void Build (register int s) { // 起点 s
	DFS (s);
	for (register int i = tic; i > 1; i --) {
		register int u = rk[i];
		for (register int j = head[1][u]; j; j = e[1][j].next) {
			register int v = e[1][j].to;
			if (! dfn[v]) continue;
			Find (v);
			if (dfn[sdom[minn[v]]] < dfn[sdom[u]]) sdom[u] = sdom[minn[v]];
		}
		f[u] = fa[u], Add (2, sdom[u], u), u = fa[u];
		for (register int j = head[2][u]; j; j = e[2][j].next) {
			register int v = e[2][j].to;
			Find (v), idom[v] = (u == sdom[minn[v]] ? u : minn[v]);
		}
		head[2][u] = 0;
	}
	for (register int i = 2; i <= tic; i ++) {
		register int u = rk[i];
		if (idom[u] != sdom[u]) idom[u] = idom[idom[u]];
	}
	
	/*
	此刻现在所有 idom[u] 已经求出,即可建支配树
	*/
}

int main () {
	n = read(), m = read();
	for (register int i = 1, u, v; i <= m; i ++)
		u = read(), v = read(), Add (0, u, v), Add (1, v, u);
	Build (1);
	return 0;
}

标签:sdom,支配,ch,int,register,科技,include
From: https://www.cnblogs.com/Rubyonly233/p/17580978.html

相关文章

  • 【企业分析】中国鱼子酱生产商鲟龙科技
    【企业分析】中国鱼子酱生产商鲟龙科技前言今天看B站知识专区的财经的时候看到一个内容叫《中国奶粉为何天价?奶粉商到底有多暴利》,感觉up主挺温柔的,于是就看她的系列视频。在《有一种歧视,叫作中国鱼子酱》。里面说到的一些事和之前我看的一些视频有关系,好奇之下了解一点。文章目录......
  • 博杰股份&盈致科技|全面升级完善信息化战略启动仪式圆满举行
    近日,珠海博杰电子股份有限公司(以下简称“博杰股份”)携手珠海盈致科技有限公司(以下简称“盈致科技”),圆满启动关于在博杰股份全面升级完善信息化战略的宣导会。 博杰股份-信息化战略建设党的二十大报告指出,新一轮科技革命和产业变革深入发展,国际力量对比深刻调整,我国发展......
  • 上海科技大学智能生活组齐聚合合信息,“沉浸式”体验人工智能产品
    近期,上海科技大学组织本科生产业实践-校企联合人才培养活动,30余名学生组成的“智能生活组”实地参访人工智能及大数据科技企业上海合合信息科技股份有限公司(简称“合合信息”)。本次活动旨在通过项目体验、主题交流,加深学生对于研究方向的专业认知,充分理解市场需求,达成学以致用的目......
  • 全球生成式AI大竞赛,Llama 2大模型现已可在亚马逊云科技上使用
    一直以来Llama可以说是AI社区内最强大的开源大模型。但因为开源协议问题,一直不可免费商用。7月19日,Meta发布了大家期待已久的免费可商用版本Llama2。一夜之间,大模型格局再次发生巨变。 作为Meta宣布的首批合作伙伴之一,现亚马逊云科技客户可通过AmazonSageMakerJumpStart使用由M......
  • 未来感智能汽车HMI设计:科技与美学的完美融合!
    当下智能电动汽车的发展势头越来越高涨,与智能电动汽车相关的汽车HMI设计也成为各个品牌重点发力的地方,汽车HMI设计正在前所未有的新高度,本篇文章就来聊聊HMI设计的那些事 ⬇⬇⬇点击获取更多设计资源https://js.design/community?category=design&source=bky&plan=bbqbky777......
  • Abaqus 中的步进、增量、迭代和尝试概念 硕迪科技
    Abaqus中的步进、增量、迭代和尝试等可能会在概念上让Abaqus初学者感到困惑。清楚地了解分析步骤、荷载增量和迭代之间的区别非常重要。在这篇文章中快速了解Abaqus步骤和增量迭代。在ABAQUS中,步进增量迭代是解决非线性问题的一种数值计算方法。这种方法通常用于模拟材料的非......
  • 热烈欢迎苏州派维斯信息总经理李华康一行访问璞华科技
    2023年7月17日,璞华科技荣幸地接待了苏州派维斯信息科技有限公司(以下简称“派维斯信息”)总经理李华康一行的到访。派维斯信息负责人&创始人李华康先生是西交利物浦大学副教授/日本会津大学计算机科学博士。参加过江苏省“六大人才高峰”高层次人才项目:基于知识图谱的物流问答技......
  • 掌数科技携手华为云GaussDB,助力金融科技创新,联合打造行业标杆
    本文分享自华为云社区《掌数科技携手华为云GaussDB,助力金融科技创新,联合打造行业标杆》,作者:GaussDB数据库。近日,在华为开发者大会2023(Cloud)的“GaussDB数据库,打造轻量化迁移部署方案”专题论坛上,掌数科技解决方案总经理高星作为华为云GaussDB的优秀合作伙伴,分享了掌数科技和华......
  • 喜讯!旭帆科技成功入驻“科大硅谷”!
    2023年7月,安徽旭帆信息科技有限公司(以下简称“旭帆科技”)成功入驻“科大硅谷”,成为合肥城市发展新引擎、科创生态集群企业队伍中的一员。“科大硅谷”项目建设总投资约75.82亿,共计17.37平方公里,是聚焦创新成果转化、创新企业孵化、创新生态优化,以中国科学技术大学等高校院所全球......
  • 冷门科技 —— DFS 序求 LCA
    Updateon2023.7.17:该技巧目前已知的最早来源:skip2004。Updateon2023.7.17:比较时,取时间戳较小的结点也是正确的,不用记录深度。DFS序求LCA无论是从时间常数,空间常数还是好写程度方面均吊打欧拉序。定义DFS序表示对一棵树进行深度优先搜索得到的结点序列,而时间戳DFN......