有向图强连通分量之tarjan算法

有向图强连通分量 文章目录有向图强连通分量1 基本概念1.1 名词解释1.2 重要性质1.3 结论2. 板子3. 例题3.1 tarjan + 缩点 + 度3.2 tarjan + 缩点 + dp3.2.1 求最长链、求方案数3.2.2 求解差分约束3.2.3 求解必经点问题 有向图强连通分量 1 基本概念 1.1 名词解释 强连通分量:如果有向图中任意两点都有互相可达的路径,则此图为强连通图。有向图G的极大强连通子图称为G的强连通分量(SCC)(单点肯定都是scc,但要使scc尽可能大,所以能大尽量大) dfn[x]数组: 阅读详情

这个算法我也不太懂,尴尬,看着伪代码,就把这个算法的模板给写出来了。。。

以后有机会再深入研究吧,这个学习态度,鄙视自己一下

 

代码:

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;

const int maxn=1001;

bool inStack[maxn];  //判断是否在栈中 
int dfn[maxn];      //dfn表示深度遍历时的访问次序 
int low[maxn];      //low表示可以回到的最小次序处
int stap[maxn];    //存储遍历过的点,便于在找到强连通分量时输出
int numVertex,numRoad,numAdj,index,stop;  //顶点数、路数、连通分量数、访问次序、控制输出的量 
vector<int> myV[maxn];   //存储有向图 

void storeMap()
{
    for(int j=0;j<maxn;j++)
    {
        myV[j].clear();
    }
    
    int from,to;
    for(int i=0;i<numRoad;i++)
    {
        scanf("%d%d",&from,&to);
        myV[from].push_back(to);
    }
}

void tarjan(int i)  //tarjan算法 
{
    int j;
    
    dfn[i]=low[i]=++index;  //深度遍历的访问次序 
    inStack[i]=true;        //访问到就相当于进栈 
    stap[++stop]=i;         //利用stap[]记录栈中的点,当找到连通分量时输出和删除 
    
    for(int k=0;k<myV[i].size();k++)   //一点一点的向下深度遍历 
    {
        j=myV[i][k];   //取出当前和i相邻的点j 
        
        if(!dfn[j])    //j没被访问过才访问,否则会重复求解连通分量 
        {
            tarjan(j);
            
            low[i]=(low[i]>low[j])?low[j]:low[i];
        }
        else if(inStack[j] && dfn[j]<low[i])
        {
            low[i]=dfn[j];
        } 
    }
    
    if(dfn[i]==low[i])
    {
        numAdj++;
        
        printf("The %dth Connected Component:\n",numAdj); 
        do
        {
            j=stap[stop--];
            printf("%d ",j); 
            inStack[j]=false;
        }while(i!=j);
        printf("\n"); 
    }
}  
    
void solve()
{
    //初始化条件 
    memset(dfn,0,sizeof(dfn));
    memset(inStack,false,sizeof(inStack));
    numAdj=index=stop=0;
    
    for(int i=1;i<=numVertex;i++)   //从所有点出发找连通分量 
    {
        if(!dfn[i])   //点i之前没出现过,否则就会重复找 
        {
            tarjan(i);
        }
    }
}
        
int main()
{
    while(scanf("%d%d",&numVertex,&numRoad)==2)
    {
        storeMap();
        
        solve();
        
        printf("The Sum Of Connected Component  Is : %d\n",numAdj); 
    }
    
    system("pause");
    return 0;
}
        

 

测试实例:

1、图形

2、输入及结果

 

 

 

 

 


 

Java实现有向图强连通分量的Tarjan算法 1 问题描述 引用自百度百科: 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。 Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个... 阅读详情

相关推荐

Windows 10下三菱PLC控件安装报错Error Number:-119的终极解决方案(附详细步骤)

本文针对Windows 10系统安装三菱PLC控件时常见的Error Number:-119报错,提供了深度分析与终极解决方案。文章剖析了该错误源于oleaut32.dll文件版本冲突,并详细介绍了通过设置兼容性模式、手动注册DLL、直接安装MX Component以及高级系统修复等多种方法,帮助用户彻底解决此安装难题,顺利搭建PLC开发环境。

weixin_29289821的博客 338

有向图的强连通分量

1.定义 在一个有向图中,如果有两个点 (u,v)(u,v)(u,v)可以在图中互相到达,那么就称这两个点是强联通的.。而如果一个有向图上的任意两点都可以互相到达,那么就成这个图为强连通图。而一个有向图中的极大强连通子图就被称为强连通分量。(极大强连通子图就是指一个强连通子图,再加入任何额外的节点都无法保证这个新的图是一个强连通图) 举个例子: 显然这个图里两个点集[1,3,5][1,3, 5][1,3,5]和 [2,4][2, 4][2,4],在各自点集里的各个点都可以互相到达,且不存在更大的点集,所以

SteveMC的博客 8271

XMind文件解析黑科技:用Python实现版本自适应读取(兼容2010-2024)

本文深入探讨了如何利用Python实现XMind文件的版本自适应解析,兼容从2010到2024年的各版本。通过分析XMind文件作为ZIP压缩包的本质,文章提供了智能探测文件内部结构(JSON或XML)并构建健壮读取逻辑的完整方案,有效解决了版本兼容性难题,并演示了将解析数据转换为PlantUML等下游应用的实战案例。

weixin_29041767的博客 684

【图论】—— 有向图的强连通分量

【图论】—— 有向图的强连通分量

forever_bryant的博客 3497

在Unity中为Sentis部署的YOLOv8模型集成NMS层并实现移动端性能优化

本文详细讲解了在Unity中利用Sentis部署YOLOv8模型时,如何通过代码动态集成NMS层以解决移动端性能瓶颈。文章核心在于避免导出时绑定NMS,转而使用Sentis原生API在运行时高效构建NMS处理流程,并分享了关键的GPU数据操作与移动端性能优化技巧,确保模型在移动设备上流畅运行。

p1q2r的博客 1095

工业产线瑕疵检测:基于 YOLO 的自动化质检系统实战

从工业瑕疵数据集构建到模型训练,从桌面检测界面到产线适用性优化,本文覆盖了一套工业质检系统的完整路线。这个场景的核心评价指标不是最高精度,而是在保证 recall ≥ 0.95 的前提下尽可能压低 false positive——因为漏检的直接成本(客户投诉、质量事故)远高于误报的成本(人工复检)。部署时先设一个偏低的置信度阈值确保覆盖,再通过持续收集人工复检数据来逐步调优。

m0_71589036的博客 67

有向图的强连通分量算法

强连通分量 Tarjan算法, Kosaraju 算法

Jasonchen1224的博客 4755

【人工智能】RAG如何根据实际需求选择和进行文档解析(如 PDF、Word、TXT、网页等)?

文档解析的核心在于根据解析目标、文档类型和处理量选择合适工具。PDF、Word、TXT和网页各有特性:PDF需区分可编辑与扫描版,Word需处理结构化内容,TXT简单但需注意编码,网页需应对动态内容。解析场景包括提取纯文本、结构化数据、保留格式和批量处理。非技术用户可借助工具如Adobe Acrobat、WPS和在线OCR,技术用户可通过编程实现自动化。通用流程为:明确目标、分析文档属性、选择工具并测试优化。核心是“工具适配需求”,无需追求万能方案。

奶爸的编程之路,也就一周冷个三天 506

有向图的强连通分量(SCC)

有向图的强连通分量(SCC) 1. 有向图的强连通分量原理 原理 强连通分量是针对有向图来说的。如下的讲解默认都是针对有向图的。 连通分量:对于一个有向图中的一些点来说,如果任意两点都能相互到达,则称这些点以及对应的边构成连通分量。 强连通分量:指极大连通分量。即该联通分量中增加任何一个点都不能构成连通分量了。 那么强连通分量有什么作用呢? 我们可以通过使用求解强联通分量的方式将一个有向图缩点成有向无环图(DAG),也称为拓扑图。缩点:指将强联通分量缩成一个点。 转化为拓扑图有什么好处

weixin_42638946的博客 4437

自然语言处理在智能客服系统中的应用

引言与背景 1.1 书籍的目的和内容概述 《自然语言处理在智能客服系统中的应用》旨在探讨自然语言处理(NLP)技术在智能客服系统中的应用,帮助读者理解NLP的核心概念及其在解决实际业务问题中的关键作用。随着人工智能技术的快速发展,自然语言处理成为构建智能客服系统的核心模块之一。本书将深入解析NLP

AI天才研究院 971

【Bug已解决】Codex CLI 报错 apply_patch 失败:无法应用补丁的解决方案

方案适用场景推荐指数统一换行符规范跨平台协作项目的标准配置⭐⭐⭐⭐⭐关闭自动格式化冲突IDE 与 Codex 并发编辑同一文件⭐⭐⭐⭐缩小任务改动范围长期有效的使用习惯优化⭐⭐⭐⭐⭐统一 UTF-8 编码涉及非 UTF-8 遗留文件的项目⭐⭐⭐提示重新读取文件单次失败后的快速恢复方式⭐⭐⭐⭐报错的本质是Codex 生成补丁时读取的文件内容,与实际应用补丁时磁盘上的文件内容出现了不一致,常见诱因包括换行符风格混用、文件被其他工具并发修改、编码问题等。

一键难忘的博客 7308

有向图强连通分量 Tarjan算法【java实现】

注:本文章上部分内容转载自http://www.cppblog.com/sosi/archive/2010/09/26/127797.html;一方面是网上有很多关于tarjan算法的介绍,我觉得都没有这个他的文章介绍的简明易懂或者没有具体的实现。另一方面,自己也顺便用java实现了一下,所以发表出来和大家分享分享! [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,

u013376508的博客 5455

精度与速度双突破:YOLOv8-Pose 在 RK3588 上实现高性能人体姿态分析部署

本教程从YOLOv8-pose模型的姿态识别训练,到RK3588的边缘量化部署,为你打造了一套“高精度+高实时性+低成本”的人体姿态分析解决方案。无论是健身动作纠正、智能安防行为检测,还是工业人员姿态监控,这套技术都能直接复用——你只需替换数据集与业务逻辑,即可快速落地专属的边缘AI姿态识别系统。如果你在实践中遇到任何卡点,欢迎随时交流。记住,人体姿态识别的价值在于“关键点准、推理快、部署易”,而这三者的平衡,正是你通过本教程能掌握的核心能力。

know_F0727的博客 435

Tarjan算法 求解有向图强连通分量

一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度。 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。 例如:在上图中,...

flymoyu的博客 419

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

有向图强连通分量Tarjan算法

在https://www.byvoid.com/zhs/blog/scc-tarjan中关于Tarjan算法的描述非常好,转述如下: 首先解释几个概念: 有向图强连通分量:在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。 如果有向图G的每两个顶点都强连通,则称G是一个强连通图。 非强连通图有向图的极大强连通子图,成为强连通分...

aling1199的博客 462

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

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

[转载] 有向图强连通分量的Tarjan算法 ——byvoid

[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。 下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两

Miracles happen every day. 1399

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Tarjan 算法求有向图强连通分量+tarjan模板

Tarjan 算法求有向图强连通分量+tarjan模板 强连通分量定义 有向图强连通分量:在有向图G中,如果两个顶点**v<sub>i</sub>**,**v<sub>j</sub>**间(**v<sub>i</sub>**>**v<sub>j</sub>**)有一条从**v<sub&gt...

王蒟蒻 328

有向图强连通分量的Tarjan算法

转自BYVoid [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。 下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1...

diuliaoquan1673的博客 77

有向图强连通分量(Tarjan)算法

在图论中,连通图基于连通的概念。在一个无向图G 中,若从顶点到顶点有路径相连(当然从到也一定有路径),则称和是连通的。如果 G 是有向图,那么连接和的路径中所有的边都必须同向。如果图中任意两点都是连通的,那么图被称作连通图。强连通图指每一个顶点皆可以经由该图上的边抵达其他的每一个点的有向图。意即对于此图上每一个点对(Va,Vb),皆存在路径Va→Vb以及Vb→Va。强连通分量则是指一张有向图

lqcsp的专栏 1052

Tarjan算法--有向图强连通分量算法

参考链接:https://www.byvoid.com/blog/scc-tarjan/ 我的算法库:https://github.com/linyiqun/lyq-algorithms-lib 算法介绍 正如标题所介绍的那样,Tarjan算法的目标就是找出图中的连通图的,其实前提条件是这样的,在一个有向图中,有时必然会出现节点成环的情况,而在图内部的这些形成环的节点所构成的图就是我们所要找

走在前往架构师的路上 3515
上一篇: 最小生成树之kruskal算法
下一篇: 树状数组学习小结
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值