Tarjan 缩点,强联通分量

Synopys 验证系列-EDA 总结 VC Formal 解决方案包括一整套正式应用程序 (App),包括属性验证 (FPV)、自动提取属性 (AEP)、覆盖分析器 (FCA)、连接性检查 (CC)、时序等效性检查 (SEQ)、寄存器验证 (FRV)、测试平台分析仪 (FTA)、形式导航器 (NAV) 以及用于验证标准总线协议的一组断言 IP (AIP)。 阅读详情

Tarjan 缩点,强联通分量

引入

如果说需要对于一个图上进行 D p \tt Dp Dp,但是同一个环上的点无法进行转移怎么办?

我们只能做 D A G \tt DAG DAG 上的 D p \tt Dp Dp,但是有环我们该怎么办?

缩环!缩点!求强联通!

当然我不是说隔壁的带花树。


虽然说所有的代码都是我随手打的,但是都已经经过测试,请放心阅读。

代码基础定义

  • dfn[x]表示当前点遍历顺序的编号。
  • low[x]表示当前点通过其 d f s \tt dfs dfs 的子树以及能通过一条边到达的点,最浅能到达的编号。

强联通分量

定义:

  有向图中能任意到达的极大点集,被称为一个强联通分量。‘

  对于一张图,我们将其划分成若干个这样的极大点集,每个点集之间的连边关系构成一张 D A G \color{red}\tt DAG DAG。

代码实现:

  我们遍历每一个弱联通分量,考虑使用一个栈来维护每个点的进入顺序。

  每次通过其能到达的点来更新 low[p]。

  • 如果说当前的儿子没有被遍历过,先遍历然后通过 low更新。
  • 如果说当前的儿子在栈中,直接通过 dfn更新就好了。

  这个更新就是根据定义来的。

  那么什么时候可以统计一个强联通分量呢?当 dfn[p] = low[p]的时候,也就是意味着其是该强联通分量 d f s \tt dfs dfs 时候遍历的第一个点,这样可以保证剩下的点都在栈中,我们直接退栈即可。

void tarjan(int p) {
    dfn[p] = low[p] = ++ tot, vis[p] = 1, st[++ ed] = p;
    for(int i = head[p];i;i = edg[i].next) {
        int to = edg[i].to;
        if(!dfn[to]) tarjan(to), low[p] = min(low[p], low[to]);
        else if(vis[to]) low[p] = min(low[p], dfn[to]);
    }
    if(dfn[p] == low[p]) {
        int y; bel[p] = ++ Sz, vis[p] = 0;
        while((y = st[ed --]) != p) {
            bel[y] = Sz, vis[y] = 0;
        }
    }
}

边双联通分量和桥

注意是在无向联通图中的。

定义:

  桥:割掉当前的边,使得图不连通。

  边双联通分量:一个点集,使得任意两点之间有两条本质不同的路径,本质不同指路径上没有相同的边。

代码实现:

  和之前的强联通分量相似。我们考虑先计算出所有桥,之后直接遍历连通块即可。

  和之前不同的在于,我们需要考虑父亲节点的贡献,我们考虑一条边 u → v u \to v u→v 是桥意味着 low[v] > dfn[u]。

  具体含义表示其最浅 不能 \color{red}\text{不能} 不能到达点 u u u,那么割掉 u → v u \to v u→v 的边就不能联通了。

  正是因为这个定义所以需要考虑 父亲节点 \color{red}\text{父亲节点} 父亲节点,对于父亲节点我们不能让其产生贡献。

int brg[maxn << 1]; // 表示当前边是否为桥
void tarjan(int p,int pre) {
    dfn[p] = low[p] = ++ tot;
    for(int i = head[p];i;i = edg[i].next) {
        int to = edg[i].to;
        if(!dfn[to]) {
            tarjan(to, i);
            low[p] = min(low[p], low[to]);
            if(dfn[p] < low[to]) brg[i] = brg[i ^ 1] = 1;
        }
        else if(i != (pre ^ 1)) low[p] = min(low[p], dfn[to]);
    }
}
/*
注意前向星建边,开始值是 cnt = 1,每次 ++ cnt。
*/

  如果说需要求边双,我们直接对于每一个点进行搜索,不走桥边即可。

本质上就是将桥都断开,看联通的极大点集。


点双联通分量和割点

注意是在无向联通图中的。

定义:

  割点:删除了该点,使得图不连通。

  点双联通分量:点集中任意两点间,存在两条本质不同路径,本质不同指不经过相同的点和边(除了这两个点)。

代码实现

  回忆一下我们边双的求法,判定条件是 dfn[p] < low[to],但是我们割点不同。

  即使儿子能到达当前点,但是我们割掉当前点之后还是不连通,所以是 dfn[p] <= low[to]。

  可以发现这时我们就不需要考虑父亲节点是否产生贡献了。

  我们可以直接在条件合法的时候将儿子节点的 d f s \tt dfs dfs 树上的节点都加入,同时加入当前节点 u u u。

  注意: \Large\color{red}\text{注意:} 注意:

  同一个点可能属于多个点双联通分量,所以我们最终建立点双图的时候需要再注意。

  我们需要特判,每个开始遍历的节点,必须遍历两个儿子之后才可能称为割点,但是点双是不影响的。

  单个点也是一个 d c c \tt dcc dcc。

  我们考虑把割点都单独建立成新的点,之后遍历每一个点双,将其和其子集中的割点连边即可。

int Rt; // Rt 表示遍历的开始节点
void tarjan(int p) {
    dfn[p] = low[p] = ++ tot, st[++ ed] = p;
    if(!head[p] && rt == p) return dcc[++ Sz].push_back(p), void();
    int fl(0);
    for(int i = head[p];i;i = edg[i].next) {
        int to = edg[i].to;
        if(!dfn[to]) {
            ++ fl;
            tarjan(to);
            low[p] = min(low[p], low[to]);
            if(dfn[p] <= low[to]) {
                if(fl > 1 || p != rt) cut[p] = 1;
                ++ Sz; int y;
                do {
                    y = st[ed --];
                    dcc[Sz].push_back(y);
                }while(y != to);
                dcc[Sz].push_back(p);
            }
        }
        else low[p] = min(low[p], dfn[to]);
    }
}

  下面是重新建图。

int tSz(Sz);
for(i = 1; i <= n; ++ i) if(cut[i]) nid[i] = ++ tSz, bel[i] = tSz;
for(i = 1; i <= Sz; ++ i) {
    for(int v : dcc[i]) if(cut[v]) {
        Add(i, nid[v]), Add(nid[v], i);
    }
    else bel[v] = i;
}
【020】C++ 动态内存管理解析:new 和 delete 的正确使用 C++中的动态内存分配是在程序运行时根据需要进行内存空间的分配和释放,与静态内存分配相比,具有更大的灵活性和适应性。动态内存分配可以通过new和delete或者malloc()和free()等函数实现。在程序运行时无法确定所需的内存大小。需要在多个函数之间共享数据,并且数据可能被频繁地创建和销毁。静态数组无法满足需求,例如需要支持可变长度数组。如果在动态分配内存后忘记了释放它,则会导致内存泄漏。为避免内存泄漏,可以使用智能指针或手动管理内存的方式来释放动态分配的内存。 阅读详情

相关推荐

DM达梦数据库远程客户端工具连接6001错误,disql可以正常连接

DM达梦数据库远程客户端工具连接6001错误,disql可以正常连接

weixin_45906061的博客 4510

tarjan缩点+强联通分量

【模板】缩点首先我们要理解这道题为什么要用缩点题目说的是有向图,如果无环的话就可以用DP来解决了由于可以走重复的点,所以一个环上的点可以看成是一个点,它的点权就等于该环上所有点的点权之和,非常符合缩点的作用,所以就可以缩成一个有向无环图,再用DP解决。

m0_60355267的博客 767

Star CCM+ 实战:旋风分离器网格加密策略与湍流模拟优化

本文针对Star CCM+中旋风分离器模拟精度不足的常见问题,深入剖析了网格质量的关键影响。文章重点介绍了通过局部网格加密策略,精准优化旋流核心区与入口区域的网格密度,从而在保证计算效率的前提下,显著提升湍流模拟的准确性与流场细节的捕捉能力,为工程实践提供了一套有效的优化方案。

water的专栏 535

BZOJ 2438 杀人游戏 强联通分量tarjan缩点

题意: 网址. 方法: 强联通分量tarjan缩点. 解析: 读完题后画一下样例 (这样例并没有什么用),所以我们还是草拟一组样例来做吧,于是找到那个 Victoria的舞会   3  的样例来看    先不管这个图输出什么,首先来分析查询每个人时候的状态。  每一个人是杀手的概率是 1 / n(这是毋庸置疑的)  {1,2,3} 是一个强连通分量,如果

-Claude 1149

复现论文报错解决

博主复现论文代码过程中遇到的各种报错及解决方案~

rellvera的博客 1060

天线学习笔记——串馈网络设计

工程中通常更倾向于使用50Ω、70.7Ω、100Ω的固定阻抗的带宽,实际中可以分别使用固定阻抗的带宽和计算得到的带宽进行仿真,观察二者的性能,取性能更优者即可。本系列是一个记录天线设计的笔记,分享出来也希望能够帮助到大家,后续本系列文章还会不定期更新,如有需要可关注,任何问题均可在评论区或私信提出,看到必回。如果对大家有帮助可进行打赏哦~

Ethan的博客 7877

强联通分量 缩点 tarjan 入门题小集

参考强联通分量及缩点tarjan算法解析 ——九野的博客 强连通tarjan模版 ——九野的博客hdu 1269题意判断给定的有向图是否强联通,即判断图中的强联通分量数是否为 11.Code#include <bits/stdc++.h> #include <stack> #define maxn 100010 using namespace std; struct Edge {

kkkkahlua的博客 516

ESP32连接OneNet云平台实现多设备联动控制完整示例

通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。

weixin_42360733的博客 547

浅谈Tarjan缩点(分析+模板)

昨天一看发现我的博客数量到100篇了,撒花✿✿ヽ(°▽°)ノ✿ 根据标题我们也知道,想要在接下来的十分钟不浪费生命 读者需要先行学习Tarjan强联通分量 如果不会的话可以点击这里:https://www.cnblogs.com/WWHHTT/p/9744658.html 好的,现在我们就假设大家都知道了Tarjan,来看看如何利用Tarjan缩点 在学习如何写代码之前,我...

287

【WorkBuddy专栏39】零基础也能做小程序——WorkBuddy微信小程序开发完全指南

【WorkBuddy专栏39】零基础也能做小程序——WorkBuddy微信小程序开发完全指南

AI人人懂 3152

备战2025数学建模国赛(算法65):Fisher判别分析

在数学建模竞赛中,我们常常会遇到需要对研究对象进行分类或判断的问题。例如,根据西瓜的各类指标判断其好坏,根据经济数据判断一个国家的发展程度,或根据病人的医学影像特征判断其是否患病。这类“分类判别”问题,是建模竞赛中最常见的题型之一。Fisher判别分析(或称线性判别分析,LDA)作为一种经典的、有监督的降维与分类方法,因其模型简洁、可解释性强、计算高效而备受青睐。

YOLO 422

tarjan 缩点笔记

tarjan笔记

.SAI.的博客 688

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

专题清理之scc-tarjan缩点

题目 loj #10091 luogu P2341 [HAOI2006]受欢迎的牛 loj #10092 luogu P2272 [ZJOI2007]最大半连通子图 luogu P2746 #10093. [USACO5.3]校园网Network of Schools/网络协议 loj #10094. 「一本通 3.5 练习 2」消息的传递 loj #10095 P1262 间谍网络 ...

AndrewLi的博客 699

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

强联通分量:Tarjan&缩点

What is 强联通分量? 让我们举个栗子 好吧其实不是这个 来我们再举个例子 强联通分量的定义就是,在有向图一组点中,如果每两个点可以互相到达,那么我们叫这组点是一个强联通分量(Strong Connected Components,简称scc) 比如说我们看上面这个图,第一个中的1,2,3,4就是一个强联通分量,因为他们任意两个点都可以互相到达,但是第二个就不是,因为4号点不能到达其他三...

NephrenRuqInsania 466

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Tarjan缩点

原题地址 先缩点,然后找出出度为0的点,如果出度为0的点多于一个,说明没有牛能被其他的牛崇拜,否则输出该缩点所包含点的个数。 #include<iostream> #include<vector> #include<cstdio> #include<cstring> #include<algorithm> #include<cstd...

qq_40634175的博客 744

[vios1023]维多利亚的舞会3<强联通分量tarjan>

题目链接:https://vijos.org/p/1023 最近在练强联通分量,当然学的是tarjan算法 而这一道题虽然打着难度为3,且是tarjan算法的裸题出没在vijos里面 但其实并不是纯粹只需要tarjan求有几个强联通就可以过的(我以为这是所谓的裸题) 其实这题还需要对每一个强联通缩点,可能被所谓裸题误导的OIer们看不破这个 毕竟,这个样例数据也是坑啊,样例数据...

baixunjiu2536的博客 154

Summer Holiday——Tarjan缩点

传送门HDU1827描述 To see a World in a Grain of SandAnd a Heaven in a Wild Flower,Hold Infinity in the palm of your handAnd Eternity in an hour. —— William B...

umalaka的博客 176

【模板】缩点

题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。 输入格式 第一行,n,m 第二行,n个整数,依次代表点权 第三至m+2行,每行两个整数u,v,表示u->v有一条有向边 输出格式 共一行,最大的点权之和。 输入输出样例 输入 #1 ...

sericon的博客 286

强联通分量 缩点 tarjan算法

/*做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间最早的节点的开始时间。初始时dfn[i]=low[i] 在DFS过程中会形成一搜索树。在搜索树上越先遍历到的节点,显然dfn的值就越小。 DFS过程中,碰到哪个节点,就将哪个节点入栈。栈中节点只有在其所属的强连通分量已经全部求出时,才

穿袜子的流氓兔的专栏 954

Tarjan算法 推导应用 LCA 缩点 割边 割点 强联通分量 边双 点双 代码

Tarjan算法 推导应用 LCA 缩点 割边 割点 强联通分量 边双 点双 代码

adfguochen的博客 669

HDOJ 1827 - Summer Holiday 简单的tarjan求强联通分量+缩点

题意:                         听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间和电话费了。他知道其他人也有一些别人的联系方式,这样他可以通知其他人,再让其他人帮忙通知一下别人。你能帮Wiskey计算出至少要通知多少人,至少得花多少电话费就能让所有人都被通知到

zzyzzy12 1394

tarjan算法缩点构图(模板)

tarjan算法简介请移步:tarjan简单介绍 tarjan在图论中算是一个很基础但是用处又很广泛的一个算法,这篇文章主要总结tarjan算法中关于缩点的模板。 用处:我们通过tarjan算法,将所有强联通分量缩成一个点,即缩点。 总结:我们就是通过缩点将有向图转变为有向无环图,再通过有向无环图的性质来解决问题。 代码: #include using namespace std; co

china震震的博客 1571

lightoj 1168 tarjan 强联通分量加缩点 加各种题目坑

#include #include #include #include #include using namespace std; vector G[2000]; vector C[2000]; int dfn[2000]; int low[2000]; int cmp[2000]; stack sta; bool instack[2000]; bool used[2000]; int top

z3635363的专栏 803

POJ 1236-Network of Schools (tarjan求强联通分量模板)

题意:给定你n个点,然后这些点之间会形成一个有向图,然后有两个任务要求。 1:问你最少选择几个节点,使得从这些点出发能发,能够到达所有的顶点。2:问你最少在这个图中加几条边,使得从添加后的图中任意一点出发,能够达到其余的所有顶点。 思路:我们要先用tarjan进行一遍原图的缩点,然后在缩完点后的新图里,对于任务1,我们可以知道,只要找到这个图中的所有入度为0的强联通分量的数目即可。而对于任务二,我们可以知道需要把入度为0的强联通分量和出度为0的强联通分量的最大值。 我们可以加了这些红色的边之后,这个图就可

forward77 171

poj 2553 The Bottom of a Graph tarjan求强联通分量&&染色缩点&&模板

We will use the following (standard) definitions from graph theory. Let V be a nonempty and finite set, its elements being called vertices (or nodes). Let E be a subset of the Cartesian product V×V, i...

W349652743的博客 220

P3387-【模板】缩点【tarjan,强联通分量,DAGdp】

正题 评测记录: https://www.luogu.org/recordnew/lists?uid=52918&amp;pid=P3387 大意 一个有向图。每个点有权值,但每个值只能取一次,每条边可以重复走,求一条路径使值最大。 解题思路 用tarjan求出每一个强联通分量,然后将每个强联通分量缩成一个点,这样这个图就变成了一个有向无环图,然后就可以按广度优先遍历进...

QuantAsk 866
上一篇: 差分约束浅谈
下一篇: 浅谈 Wqs 二分
sharp_legendgod
博客等级 码龄7年 8粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值