Codechef GRAPHCNT 支配树学习及tarjan算法求解

article/2025/5/19 14:19:14

[Codechef GRAPHCNT]新年的有向图

【题目描述】


zlx同学在学习数论时,被虐了一脸,丧心病狂的他决定去报复社会。

zlx在公园里埋下N颗地雷,用来炸飞在春节期间秀恩爱的情侣。这N颗地雷由M条有向边连接成为一个有向图,zlx则在1号地雷处引爆1号地雷可以到达的地雷。现在,为了更好的实施这个计划,zlx需要知道存在多少对地雷(x,y),使得存在一条1到x和一条1到y的路径,这两条路径不经过同一个点(点1除外)。


【输入格式】

第一行为两个正整数N,M。

之后的M行,每行两个正整数v,u。代表存在一条v到u的有向边。

【输出格式】

输出有多少点对满足题目要求。

【样例输入】

6 6
1 2
1 3
1 4
2 5
2 6
3 6

【样例输出】

14

【提示】

对于30%的数据,图为有向无环图。

对于100%的数据,N<=100000,M<=500000


支配树简介

什么是支配树?支配树是什么?
对于一张有向图(可以有环)我们规定一个起点r(为什么是r呢?因为网上都是这么规定的),从r点到图上另一个点w可能存在很多条路径(下面将r到w简写为r->w)。 
如果对于r->w的任意一条路径中都存在一个点p,那么我们称点p为w的支配点(当然这也是r->w的必经点),注意r点不讨论支配点。下面用idom[u]表示离点u最近的支配点。 
对于原图上除r外每一个点u,从idom[u]向u建一条边,最后我们可以得到一个以r为根的树。这个树我们就叫它“支配树”。

相似

这个东西看上去有点眼熟? 
支配点和割点(删掉后图联通块数增加)有什么区别? 
我们考虑问题给定一个起点r和一个终点t,询问删掉哪个点能够使r无法到达t。 
很显然,我们删掉任意一个r->t的必经点就能使r无法到达t,删掉任意一个非必经点,r仍可到达t。 
从支配树的角度来说,我们只需删掉支配树上r到t路径上的任意一点即可 
从割点的角度来说,我们是不是只需要考虑所有割点,判断哪些割点在r->t的路径上即可?是否将某个割点删掉即可让r无法到达t? 
这当然是不正确的,我们可以从两个方面来说明它的错误:

  1. 删掉割点不一定使r无法到达t
    情况1
    这个图中点u是关键点(删掉后图联通块个数增加)
    并且u在r->t的路径上,然而删掉点u后r仍然可以到达t
  2. 图中不一定存在割点
    情况2
    在这个图中不存在任何割点

所以我们没有办法使用割点来解决这个问题。

简化问题

  • 对于一棵树,我们用r表示根节点,u表示树上的某个非根节点。很容易发现从r->u路径上的所有点都是支配点,而idom[u]就是u的父节点。 
    这个可以在 O(n) 的时间内实现。

  • DAG(有向无环图)

    因为是有向无环图,所以我们可以按照拓扑序构建支配树。 
    假设当前我们构造到拓扑序中第x个节点编号为u,那么拓扑序中第1 ~ X-1个节点已经处理好了,考虑所有能够直接到达点u的节点,对于这些节点我们求出它们在支配树上的最近公共祖先v,这个点v就是点u在支配树上的父亲。 
    如果使用倍增求LCA,这个问题可以在   O((n+mlog2       n) 的时间内实现。

对于这两个问题我们能够很简便的求出支配树。

有向图

对于一个有向图,我们应该怎么办呢?

简单方法

我们可以考虑每次删掉一个点,判断哪些点无法从r到达。 
假设删掉点u后点v无法到达,那么点u就是r->v的必经点(点u就是v的支配点)。 
这个方法我们可以非常简单的在 O(nm) 的时间内实现。 
其中 n 是点数, m 是点数。

更快的方法

这里,我将介绍Lengauer-Tarjan算法。 
这个算法能在很快的时间内求出支配树。 
要介绍这个算法我们还需引入两个定理和一些概念

大概步骤

首先来介绍一些这个算法的大概步骤

  1. 对图进行DFS(深度优先遍历)并求出搜索树和DFS序。这里我们用 dfn[x] 表示点 x 在dfs序中的位置。
  2. 根据半必经点定理计算出所有的半必经点作为计算必经点的根据
  3. 根据必经点定理修正我们的半必经点,求出支配点

半必经点

我们用idom[x]表示点x的最近支配点,用semi[x]表示点x的半必经点。 
那什么是半必经点呢?

对于一个节点 Y ,存在某个点 X 能够通过一系列点 p i (不包含 X Y )到达点 Y i   df

文章来源:https://blog.csdn.net/tham_/article/details/76286577
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://chatgpt.dhexx.cn/article/XjBiwPoY.shtml

相关文章

大数据体系建设经验分享

分享嘉宾&#xff1a;吴荣彬 分贝通 大数据部负责人 编辑整理&#xff1a;zlx 出品平台&#xff1a;DataFunTalk 导读&#xff1a;本文将介绍分贝通在大数据领域的一些建设经验。分贝通在ToB领域是一个年轻的公司&#xff0c;成立六年多&#xff0c;大数据体系刚刚建立一年多&a…

将二维数组转为稀疏数组进行压缩,提高效率

** 稀疏数组 ** ##基本介绍&#xff1a; 当一个数组中大部分元素为&#xff10;&#xff0c;或者为同一个值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: 1) 记录数组一共有几行几列&#xff0c;有多少个不同的值 2) 把具有不同值的元素的行列…

A数字三角 怨种

问题描述 有一天&#xff0c;无聊的 zlx 从 1 开始数数&#xff0c;同时在纸上写下每个数的个位数字。因为她非常热爱直角三角形&#xff0c;所以在纸上写下的数字按照直角三角形排列。现在告 诉你写她了 N 行数字&#xff0c;要求你打出这些数字。 输入格式 一行一个数 N&a…

聊聊Spring的IOC,AOP、DI、MVC

1 聊聊Ioc,Di,Mvc,Aop 不想看下面内容的&#xff0c;直接上代码连接&#xff0c;以下代码都有注释 传送门 1.1 看启动项 我们先来看看启动项 package com.tian;import com.tian.springframework.annotation.SpringBootApplication; import com.tian.springframework.config…

ZYNQ DDS产生载波FFT变换

环境&#xff1a;vivado2017.4&#xff0c;快速傅里叶变换V9.0 IP核 一&#xff0c;介绍&#xff1a;Xilinx FFT IP核是一种计算DFT的有效方式。 特点&#xff1a;前向变换&#xff08;FFT&#xff09;和反向变换&#xff08;IFFT&#xff09;在复数空间&#xff0c;并且可…

并发队列中迭代器弱一致性原理探究

一、前言 并发队列里面的Iterators是弱一致性的&#xff0c;next返回的是队列某一个时间点或者创建迭代器时候的状态的反映。当创建迭代器后&#xff0c;其他线程删除了该元素时候并不会抛出java.util.ConcurrentModificationException异常&#xff0c;能够保持创建迭代器后的元…

浅谈同构类问题的骗分算法

ZLX算法-----同构类问题的有力骗分算法前言&#xff1a;ZLX算法是一种解决判定性同构问题的蒙特卡罗式骗分算法&#xff1a;总能在确定的运行时间内出解&#xff0c;但是得到的解不能保证正确。尽管由于具有拓扑序&#xff0c;树同构和仙人掌同构存在多项式算法&#xff0c;但是…

win10下修改C盘用户文件夹名

之前安装一个程序出错&#xff0c;上网百度后是用户文件夹名为中文&#xff0c;也在网上找了好多方法&#xff0c;有同步的&#xff0c;有修改注册表的&#xff0c;最后我找到一个比较简单而且数据保留完整的方法。这种方法也会自动修改用户的环境变量&#xff0c;不过修改完后…

【Windows】Win10-更改c盘下的用户文件夹名

转载ooooohugh的文章&#xff0c;原文地址&#xff1a;https://blog.csdn.net/qq_33530388/article/details/71739845 当初 不小心用自己名字 作为计算机用户名&#xff0c;后来 许多软件因为 不支持 路径中有中文&#xff0c;导致吃了不少的亏&#xff0c;心疼。。。。 下面说…

Windows10更改c盘中用户名对应的文件名字

目录 前言一、修改步骤1.开启管理员账号并登陆2.重启电脑3.登录管理员账号4.重命名用户名对应的文件夹5.修改Path6.重启电脑并切换回你的账号7.修改环境变量8.重启电脑 二、修改导致的问题1.桌面大部分软件快捷方式失效2.部分软件无故消失 三、提醒Last 前言 强烈建议看完此文…

win10 修改c盘用户文件夹名称

c盘用户文件夹如果是中文名 可能会导致需要没必要的麻烦&#xff0c;记录一下修改方法 第一步&#xff1a;如果你电脑不是本地用户administrator&#xff0c;注销当前用户使用administrator登录 按winx 点击关机或注销 在点击注销 注销后如果没有Administrator登录方式&#…

有关windows10修改C盘用户中文名文件夹相关问题的具体解决方案

win10修改用户文件夹名 今天在下载安卓sdk开发工具的时候&#xff0c;安装出现了一个问题如图&#xff0c;左下角提示我们的sdk路径含有非ascll的字符&#xff0c;无法继续安装&#xff0c;其实不只是中文字符&#xff0c;英文字符中间若有空格也不能继续安装。 对于互联网学…

更改计算机用户文件夹,win10系统怎么自定义C盘用户文件夹名称

许多用户在安装win10系统之后&#xff0c;想要让电脑显得更加个性化&#xff0c;就想要给C盘中的用户文件夹名称进行自定义修改&#xff0c;那么win10系统怎么自定义C盘用户文件夹名称呢&#xff1f;接下来给大家分享一下具体的操作步骤。 1、在键盘上按下Windows键X 组合键&am…

Windows 11 的C盘User(用户)文件夹下的用户文件夹名称的修改

背景介绍&#xff1a;由于系统重装导致Windows 11的系统用户名与C盘User&#xff08;用户&#xff09;文件夹下的用户名文件夹&#xff08;公用文件夹旁边的文件夹&#xff09;出现名称不一致&#xff0c;事例中系统用户名命名为“寂萧”&#xff0c;User&#xff08;用户&…

win10怎么更改c盘用户计算机名,详解win10系统更改c盘用户名文件夹名称的设置技巧...

电脑一旦开机就会不停的运行&#xff0c;不可避免会出现软硬件问题&#xff0c;win10系统更改c盘用户名文件夹名称就是比较常见的状况&#xff0c;尤其是姑娘们遇到win10系统更改c盘用户名文件夹名称是要难过哭鼻子的&#xff0c;其实小编的经验是碰到win10系统更改c盘用户名文…

Windows 10系统中,如何重命名用户文件夹

免责声明 该方法不适用于所有情况&#xff0c;可能导致数据丢失、计算机无法重启等问题&#xff0c;请提前保护好数据&#xff01; 背景 许多Windows用户总是喜欢将文件放在用户文件夹&#xff08;C:\Users\username&#xff09;下&#xff0c;但有时候会发生一些令人苦恼的…

win10修改C盘用户文件夹下的文件命名

唉&#xff01;&#xff01;&#xff01;以前不太懂这些&#xff0c;取了个中文用户名。结果下载软件的过程中&#xff0c;各种出错&#xff0c;就是路径里面含有中文导致的。 这种情况下还都不能直接重命名&#xff0c;我试了各种方法&#xff0c;都不适合&#xff0c;最后找到…

windows修改用户文件夹名称 更改用户名 修改C盘Users目录下文件夹名称

知乎上的更详细版本 windows修改 C:\Users用户文件夹名称 把中文名修改为英文名 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/509804656 简短的说&#xff1a; 1 - 新建一个管理员账户A&#xff08;名称随意&#xff0c;不要和其他账户一样&#xff09;&#xff0c;注销…

win11修改C盘用户文件夹名称

新电脑使用microsoft账号进行初始化&#xff0c;导致用户文件夹名称是邮箱前五位&#xff0c;这个真的让人头痛。网上很多方法是直接改名称、改注册表信息等&#xff0c;导致出问题&#xff0c;结果要重装系统&#xff0c;很麻烦。 其实有一个很好的解决方法&#xff0c;如下&a…

如何修改C盘用户文件夹下的用户名

1、WindowsR&#xff0c;然后输入regedit&#xff0c;点击确定。 2、进入注册表编辑器后&#xff0c;依次打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList。 3、打开ProfileList后&#xff0c;打开最后一项&#xff0c;然后在右侧找到Profile…