支配树学习笔记

news2024/9/22 21:29:07

学习链接【学习笔记】支配树_cz_xuyixuan的博客-CSDN博客

主要的求法是最后两个结论:

定理4用来求sdom,先搞一个dfs树,然后将点按dfs序从大到小加入,对每个点维护到当前根(即已加入点)路径上sdom最小是哪个(sdom的比较是对dfs序比)记为home,可以用带权并查集完成。加入一个点,就先枚举所有能直接到达本身的相邻点,用他们的home更新我,然后加入我到dfs树父亲的边。

然后用推论1求idom,写一个倍增求(sdom[x], x]路径上sdom最小的点即可。

模板题 HDU4694 (建立根在n的支配树)

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define pii pair<int, int>
#define fi first
#define sc second
using namespace std;
const int inf = 1e9;
const int N = 2e6 + 100;
const ll mod = 998244353;

void sol(int n, int m) {
	vector<vector<int>> adj(n + 1), radj(n + 1), tree_adj(n + 1);
	for (int i = 1; i <= m; i++) {
		int x, y;
		cin >> x >> y;
		adj[x].pb(y);
		radj[y].pb(x);
	}
	int tim = 0;
	vector<int> rnk(n + 1, 0), dfn(n + 1, 0), tree_fa(n + 1, 0);
	function<void(int)> dfs = [&](int x) {
		rnk[x] = ++tim, dfn[tim] = x;
		for (int y : adj[x]) {
			if (!rnk[y]) {
				tree_fa[y] = x;
				tree_adj[x].pb(y);
				dfs(y);
			}
		}
	};
	dfs(n);
	vector<int> sdom(n + 1, 0), rt(n + 1, 0), home(n + 1, 0);
	iota(all(sdom), 0);
	iota(all(rt), 0);
	iota(all(home), 0);
	
	function<int(int)> get_home = [&](int x) {
		if (rt[x] == x) {
			return home[x];
		}
		int tmp = get_home(rt[x]);
		if (rnk[sdom[tmp]] < rnk[sdom[home[x]]]) {
			home[x] = tmp;
		}
		rt[x] = rt[rt[x]];
		return home[x];
	};
	
	for (int i = n; i >= 1; i--) {
		int x = dfn[i];
		for (int y : radj[x]) {
			if (rnk[y] && rnk[sdom[get_home(y)]] < rnk[sdom[x]]) {
				sdom[x] = sdom[get_home(y)];
			}
		}
		rt[x] = tree_fa[x];
	}
	vector<int> dep(n + 1, 0);
	vector<vector<int>> jp(20, vector<int>(n + 1, 0)), mn(20, vector<int>(n + 1, 0));
	vector<int> idom(n + 1, 0);
	vector<ll> sum(n + 1, 0);
	function<void(int)> dfs_tree = [&](int x) {
		jp[0][x] = tree_fa[x];
		mn[0][x] = x;
		for (int j = 1; j < 20; j++) {
			jp[j][x] = jp[j - 1][jp[j - 1][x]];
			if (rnk[sdom[mn[j - 1][jp[j - 1][x]]]] < rnk[sdom[mn[j - 1][x]]]) {
				mn[j][x] = mn[j - 1][jp[j - 1][x]];
			} else {
				mn[j][x] = mn[j - 1][x];
			}
		}
		int dt = dep[x] - dep[sdom[x]];
		int ps = x, cur = x;
		for (int j = 19; j >= 0; j--) {
			if (dt >> j & 1) {
				if (rnk[sdom[mn[j][cur]]] < rnk[sdom[ps]]) {
					ps = mn[j][cur];
				}
				cur = jp[j][cur];
			} 
		}
		if (sdom[ps] == sdom[x]) {
			idom[x] = sdom[x];
		} else {
			idom[x] = idom[ps];
		}
		sum[x] = sum[idom[x]] + x;
		for (int y : tree_adj[x]) {
			dep[y] = dep[x] + 1;
			dfs_tree(y);
		}
	};
	dfs_tree(n);
	for (int i = 1; i <= n; i++) {
		cout << sum[i] << " \n"[i == n];
	}
}

signed main() {

	ios::sync_with_stdio(0);
	cin.tie(0);
//	int tt;
//	cin >> tt;
//	while (tt--)
	int n, m;
	while (cin >> n >> m)
	sol(n, m);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/801812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物联网场景中的边缘计算解决方案有哪些?

在物联网场景中&#xff0c;边缘计算是一种重要的解决方案&#xff0c;用于在物联网设备和云端之间进行实时数据处理、分析和决策。HiWoo Box作为工业边缘网关设备&#xff0c;具备边缘计算能力&#xff0c;包括单点公式计算、Python脚本编程以及规则引擎&#xff0c;它为物联网…

《Kubernetes故障篇:unable to retrieve OCI runtime error》

一、背景信息 1、环境信息如下&#xff1a; 操作系统K8S版本containerd版本Centos7.6v1.24.12v1.6.12 2、报错信息如下&#xff1a; Warning FailedCreatePodSandBox 106s (x39 over 10m) kubelet (combined from similar events): Failed to create pod sandbox: rpc error: …

python语句学习系列(2)--读取.dat文件

系列文章目录 文章目录 系列文章目录前言1、引入库2、读取dat文件3、输出行列数控制(省略号去除)4、只显示前/后几行5、保存为Excel总结 前言 1、引入库 import pandas as pd import numpy as np import sys2、读取dat文件 2.1、第一种读取 df pd.read_table(r"E:\p…

FastText使用介绍

FastText概念介绍 FastText 是一个由 Facebook 开发的用于文本分类和向量化的开源工具&#xff0c;它是 Word2Vec 的一个拓展&#xff0c;能够处理词汇中的子词信息。FastText 基于神经网络模型&#xff0c;可以将词语表示为高维向量&#xff0c;并且保留了词汇中的语义信息。…

亚马逊美国站暖风机UL1278测试报告

取暖器是指用于取暖的设备&#xff0c;取暖设备根据加热介质不同、加热原理不同&#xff0c;大体可以分为&#xff1a;燃气取暖设备、电加热取暖设备、锅炉取暖设备、电壁挂炉取暖。但一般这类产品要上架美国亚马逊平台都必须要办理UL1278测试报告。 一、UL1278标准适用产品范围…

vscode搭建用ASP文件测试开发的环境

下载iis express安装包&#xff0c;iis express下载链接&#xff1a;Download Internet Information Services (IIS) 10.0 Express from Official Microsoft Download Center ​ 不适合的可以下载旧的iis express版本&#xff0c;系统没有相适应的.Net版本的还要下载。 安装完…

Java 版 spring cloud +spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

网络安全(黑客)自学建议笔记

前言 网络安全&#xff0c;顾名思义&#xff0c;无安全&#xff0c;不网络。现如今&#xff0c;安全行业飞速发展&#xff0c;我们呼吁专业化的 就职人员与大学生 &#xff0c;而你&#xff0c;认为自己有资格当黑客吗&#xff1f; 本文面向所有信息安全领域的初学者和从业人员…

IBM Spectrum LSF —— 计算资源的管理和批处理作业的调度

IBM Spectrum LSF 是什么&#xff1f; LSF&#xff08;Load Sharing Facility&#xff09;是IBM旗下的一款分布式集群管理系统软件&#xff0c;负责计算资源的管理和批处理作业的调度。它给用户提供统一的集群资源访问接口&#xff0c;让用户透明地访问整个集群资源。同时提供了…

如何使用Redis配置与优化

目录 一、关系数据库与非关系型数据库 关系型数据库 非关系型数据库 关系型数据库和非关系型数据库区别 ① 数据存储方式不同 ② 扩展方式不同 ③ 对事务性的支持不同 非关系型数据库产生背景 二、Redis概念 Redis优点 三、Redis 安装部署 第一步 关闭防火墙和安全…

【Nodejs】接口规范和业务分层

1.接口规范-RESTful架构 1.1 什么是REST REST全称是Representational State Transfer&#xff0c;中文意思是表述&#xff08;编者注&#xff1a;通常译为表征&#xff09;性状态转移。 它首次出现在2000年Roy Fielding的博士论文中&#xff0c;Roy Fielding是HTTP规范的主要编…

Eclipse memory analyzer 分析GC dump日志定位代码问题

1、问题描述&#xff1a; 使用命令 jstat -gcutil [pid] 查看JVM GC日志&#xff0c;发现生产系统频繁FullGC&#xff0c;大概几分钟一次&#xff0c;而且系统响应速度变慢很多 再使用 free -g 查看服务器内存全部占用&#xff0c;猜测是内存溢出了 2、导出dump日志 jmap -du…

SpringBoot项目部署在Windows与Centos上

文章目录 Windows部署一、github上下载文件winsw二、文件目录三、编辑xml文件四、安装服务五、启动服务六、把jar包放到项目外面七、添加限制内存 Linux部署一、准备二、服务三、操作 Windows部署 windows部署服务借鉴于此篇博文 一、github上下载文件winsw 点击链接下载下图…

等分切割图片的方法

在做数据集的过程中&#xff0c;有时候需要将大图进行切分成小图片&#xff0c;一方面是为了满足训练需要&#xff0c;一方面是为了扩增数据集。 如下图的尺寸为5472x3648,但是我用不着这么大的图片&#xff0c;需要将图9等分 市面上也有等分切割图片的软件或者网站&#xff…

python_day16_设计模式

“”“单例模式”“” “”“工厂模式”“” class Person:passclass Worker(Person):passclass Student(Person):passclass Teacher(Person):passclass Factory:def get_person(self, p_type):if p_type w:return Worker()elif p_type s:return Student()else:return Te…

深度学习,卷积神经网络

卷积神经网络 1.卷积神经网络应用领域 CV领域发展 CV领域是计算机视觉&#xff08;Computer Vision&#xff09;领域的简称。 计算机视觉是指利用计算机模拟人类视觉系统的科学&#xff0c;让计算机具有类似于人类在观察外界的视觉、图像的能力&#xff0c;包括图像处理、图…

无涯教程-jQuery - ajaxSend( callback )方法函数

ajaxSend(callback)方法附有一个在发送AJAX请求时要执行的功能。这是一个Ajax事件。 ajaxSend( callback ) - 语法 $(document).ajaxSend( callback ) 这是此方法使用的所有参数的描述- callback - 要执行的功能。用于该请求的XMLHttpRequest和设置将作为参数传递给回调…

Excel的使用

1.EXCEL诞生的意义 1.1 找到想要的数据 1.2 提升输入速度 2.数据分析与可视化操作 目的是提升数据的价值和意义 3.EXCEL使用的内在意义和外在形式 4.EXCEL的价值 4.1 解读及挖掘数据价值 4.2 协作板块 4.3 展示专业度 4.4 共享文档内容 5.人的需求》》软件功能

SFP3012A-ASEMI代理海矽美(MHCHXM)快恢复二极管

编辑&#xff1a;ll SFP3012A-ASEMI代理海矽美&#xff08;MHCHXM&#xff09;快恢复二极管 型号&#xff1a;SFP3012A 品牌&#xff1a;ASEMI 芯片个数&#xff1a;1 芯片尺寸&#xff1a;102MIL*2 封装&#xff1a;TO-247AC 恢复时间&#xff1a;75ns 工作温度&#…

1300*B. T-primes

解析&#xff1a; 有且只有三个因数&#xff0c;当且仅当&#xff0c;完全平方数并且sqrt&#xff08;n&#xff09;为素数 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e55; ll t,n; bool prime(ll x){if(x<2) return 0;for(int…