Tarjan找强连通分量

图论——强连通分量详解! 强连通分量等概念Tarjan算法的过程与实现就讲这么多,平时练习多注意vector与链式前向星的转换。今宵东方不见日,总有夜尽天明时。加油拜拜~~~(特意标红。。。 阅读详情

概念

强连通

如果在一张图中有一条路径连接两点,则这两点强连通。(间接连接也可以)(主要针对单向图)

强连通图

如果一张图中任意两点都强连通,则这张图为强连通土。

强连通分量

如果一张图的某个子图为强连通图,则称其为强连通分量。

算法思路

该算法主要用于有向图。对于每一个点,赋予两个属性:dfn和low。dnf记录该点被访问的次序。low记录与该点联通的所有点的dfn的最小值。对访问每一个点时:
1.赋予两个属性,并将该点压入栈。
2.访问每个子节点,之后更新low。
3.判断dfn和low是否相等,若相等,则可以确定一个强连通分量,并将这些联通点弹出栈。

代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int n,m;
vector<int> e[505];
int stack[505],hd,index;//模拟栈 
bool vis[505];//是否在栈中 
int dfn[505],low[505];
int cnt;
void add(int x,int y)
{
 e[x].push_back(y);
}
void tarjan(int u)
{
 vis[u]=1;
 dfn[u]=low[u]=++index;
 stack[++hd]=u;
 for(int i=0;i<e[u].size();i++)
 {
  int v=e[u][i];
  if(!dfn[v])//此处以时间戳dfn判断是否访问过 
  {
   tarjan(v);
   low[u]=min(low[u],low[v]);//访问完后可以更新Low 
  }
  else//访问过也有可能更新low 
  {
   if(vis[v]) low[u]=min(low[u],low[v]);
  }
 }
 if(dfn[u]==low[u])//找到连通分量根节点
 {
  cnt++;
  printf("%d:",cnt);
  do
  {
    printf("%d ",stack[hd]);
    vis[stack[hd--]]=0;
  }while(stack[hd+1]!=u);
  cout<<endl;
 } 
}
int main()
{
 scanf("%d%d",&n,&m);
 for(int i=1;i<=m;i++)
 {
  int x,y;
  scanf("%d%d",&x,&y);
  add(x,y);
 }
 for(int i=1;i<=n;i++)//排除孤立点干扰 
 {
  if(!dfn[i]) tarjan(i);
 }
 return 0;
 } 
数据结构——强连通分量图算法 介绍图论中的强连通分量算法 阅读详情

相关推荐

Tarjan——求有向图的强连通分量

强连通:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。 [vi-vj之间可以经过多个节点]强连通图:如果有向图G的每两个顶点都强连通,称G是一个强连通图。强连通分量:非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected compone

六天 1405

强连通分量(Tarjan算法) 图解

最详细的tarjan图解!

qq_25930891的博客 7009

tarjan 算法求强连通分量

转自大牛 全网最详细tarjan算法讲解,我不敢说别的。反正其他tarjan算法讲解,我看了半天才看懂。我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关于 图的联通性的神奇算法。基于DFS(迪法师)算法,深度优先搜索一张有向图。!注意!是有向图。根据树,堆栈,打标记等种种神(che)奇(dan)方法来完成剖析一个图的工作。而图的联通性,就是

Marcus-Bao的个人主页 932

教你把有向图的强连通分量刻进DNA里

生动的语言讲述有向图的强连通分量模型和2-SAT应用

GROZAX的博客 522

基于Python的单目三维重建:从特征匹配到点云可视化

三维重建是计算机视觉的核心技术,通过多视图几何原理从二维图像恢复三维结构。单目方案利用对极几何和三角化,在Python生态中结合OpenCV与Open3D实现特征提取、位姿估计和点云生成。其技术价值在于低成本、易调试,适合课程设计和快速原型开发。典型应用包括文物数字化、场景建模和视觉SLAM。本文聚焦单目重建的工程实践,提供从匹配到可视化的完整代码方案,并分享避坑经验。

weixin_34413802的博客 425

kosaraju:Kosaraju 算法是一种线性时间算法,用于查找有向图的强连通分量

kosaraju 算法 Kosaraju 算法是一种线性时间算法,用于查找有向图的强连通分量 算法 Kosaraju 算法的工作原理如下: 设 G 为有向图,S 为空栈。 虽然 S 不包含所有顶点: 选择不在 S 中的任意顶点 ''v''。从 ''v'' 开始执行深度优先搜索。 每次深度优先搜索完成扩展顶点 ''u'' 时,将 ''u'' 推到 S 上。 反转所有圆弧的方向以获得转置图。 当 S 非空时: 从 S 弹出顶部顶点 ''v''。从转置图中的 ''v'' 开始执行深度优先搜索。 访问顶点集将给出包含“v”的强连通分量; 记录并从图 G 和堆栈 S 中删除所有这些顶点。等效地,可以使用广度优先搜索 (BFS) 代替深度优先搜索。 表现 需要注意的是,如果图的输入尺寸很大,递归的方式会导致 StackOverflowException。 因此,这里使用迭代版本。

强连通分量及缩点tarjan算法解析

强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Time, DFN[N], Low[N]; DFN[i]表示 遍历到 i 点时是第几次dfs Low[u] 表示 以u点为父节点的 子树 能连接到 [栈中] 最上端的点   int

九野的博客 72万+

数据结构与算法 —— 最短路径Dijkstra算法(迪杰斯特拉)详细图解以及python实现

前两章我们讲到了关于图的基本知识,和广度/深度优先搜索。本章,我们将介绍加权图和最短路径的相关知识。最短路径和最小生成树是图论中常见的问题。最短路径是指在一个图中找到两个节点之间的最短路径,最小生成树是指在一个图中找到一个连通子图,使得所有节点都能够互相到达,且总权值最小。最短路径算法常见的有floyd算法(弗洛伊德算法)和 dijkstra算法(迪杰斯特拉)。本文只介绍dijkstra算法。最短路径运用非常广泛,比如在导航系统中,确定两个地点间哪条路线最短;

‘’ 2万+

强连通分量(Tarjan算法)

强连通分量 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量。 Tarjan 算法是基于对图优先搜素的算法 , 每个强连通分量为搜索树中的一棵子树...

森宝的博客 8235

开源生成式推荐框架MiniOneRec实践:从SID构建到RL微调全解析

在推荐系统领域,从协同过滤到深度学习,核心目标始终是精准预测用户兴趣。其技术原理经历了从矩阵分解到深度神经网络的演进,旨在从海量用户行为数据中挖掘复杂模式。随着大语言模型(LLM)的兴起,生成式推荐作为一种新兴范式,将推荐问题重构为序列生成任务,展现出更强的泛化能力和端到端优化潜力,尤其适合处理动态、多模态的推荐场景。本文聚焦于首个完全开源的生成式推荐框架MiniOneRec,它通过引入语义商品ID(SID)解决物品离散化难题,并采用监督微调(SFT)与强化学习(RL)结合的完整训练流程,为工程师和研究者提

weixin_42573647的博客 534

CyberChef本地搭建

CyberChef本地搭建

2301_80241182的博客 6077

Tarjan求强连通分量

[算法定义] 在有向图中,如果两个顶点至少存在一条路径(可以相互通达),则称两个顶点强连通(strongly connected)。 如果有向图G的每两个顶点都强连通,称G是一个强连通图。 非强连通有向图的极大强连通子图,称为强连通分量(strongly connected components)。 在上图中,{1 , 2 , 3 , 4 } , { 5 } , { 6 } 三个区域...

weixin_44959460的博客 5281

深入探讨 VQ-VAE:理解变分量化自动编码器

VQ-VAE代表"Variational Quantized Variational Autoencoder",是一种生成模型,通常用于处理高维数据,如图像和音频。它的设计灵感来自于变分自动编码器(VAE)和量化方法,结合了它们的优点,使得 VQ-VAE 能够生成高质量的数据,并在数据表示上引入离散性。VQ-VAE 是一种强大的生成模型,结合了变分自动编码器和量化方法的优点。它在图像和音频生成、数据压缩和生成性对抗网络等领域具有广泛的应用。

DeepViewInsight的博客 7016

强连通分量 Tarjan

强连通分量 Tarjan 前言 其实很早就会用Tarjan打强连通了,但还是有些一知半解,也忘性大,现在总结一下。 强连通分量的定义 假设我们现在有这个图: 很显然这三个点两两之间可以到达,那么我们就称这个图是强连通的。 假设我们多加一个节点 之前的子图强连通,但不是强联通分量,因为它不是最大的强连通子图,而{1,2,3,4}是强连通分量。一个图可能有多个强连通分量,但我们找强连通一定要找尽可...

Cass-ette的博客 544

Verilog仿真必备:FSDB dump命令全解析与实战配置指南

本文深入解析了Verilog仿真中FSDB波形记录的核心命令与实战配置技巧。针对大规模SoC验证场景,详细介绍了如何通过$fsdbDumpvars、$fsdbDumpfile等命令实现信号精准捕获、文件体积控制和动态启停,并提供了智能化的分层dump策略,帮助工程师在保证调试信息完整性的同时,大幅提升验证效率并有效管理波形数据。

cnn8visionary的博客 348

使用这个算法我可以实现英雄联盟里英雄的走位|Java 开发实战

A算法,A(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 基本概念 首先在大学我们遇到最多的算法Dijkstra、Floyd、广度搜索、深度搜索。关于这些算法我们以后再慢慢的研究,今天的重点在A算法上。A算法是一种启发式算法。与上述几种算法不同的是A*算法在考虑起始节点的同时还会考虑到目标节点的代价。 在A*算法中我们给每个节点都定义一些属性。最基本的就是下文提到的三基数-这里的三基数是我自己定义.

Java进阶营 312

Tarjan 强连通分量

强连通分量 图中找到一个最大的子图,使得子图中任意两个节点相互到达。 一个点也是一个强连通分量 Tarjan 构成强连通分量是必定是dfs树的一棵子树,在对树进行dfs的时候记录访问时间dfn和以该节点为根节点的子树的最小编号low,将节点加入栈中并递归它的子节点,子节点在栈中更新根节点的low,子节点没有访问过就继续递归下去。 在回溯的时候,当dfn == low 表示改点可以通过栈中的节点...

Running Bit. 644

如何用libwebsocket库在stm32F407上实现websocket客户端?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1134

Tarjan算法——求强连通分量

什么是强连通分量 强连通分量,是一个有向图的最大强连通子图(看起来好像没有什么解释效果…),好吧,强连通分量就是在一个有向图中,从任意一个点出发,最多可以走过的所有的点构成的一个点集,将其称之为强连通。强连通分量就是这些集合里面最大的那个。如下图: 2,3,5,就是强连通的,因为从二出发可以到达2,3,5的任意一个点。所以1,4,也是强连通的。我们不难发现,除了双向边以外,强连通都是环套环的形式...

Martisum的博客 3512

华为OD机试真题 新系统 9月27号 【数据中心最佳维护窗口】

华为OD机试真题 新系统【数据中心最佳维护窗口】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【数据中心最佳维护窗口】多语言题解。

qq_45776114的博客 1154

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

两种强连通分量算法——tarjan和kosaraju

这两个算法其实都非常简单,其中tarjan算法只需进行一次dfs,更为高效。但我更喜欢kosaraju算法,因为这个算法的思考过程更加巧妙。 tarjan算法的思想非常简单直观,随便找篇教程就很容易理解,下面我主要讲讲kosaraju算法。 kosaraju算法进行两次dfs,第一次在原图上进行,并在结点递归调用返回时将结点压入一个栈中,第二次dfs在原图的逆图上进行,并且初始点选择栈中最上面

cgjiayou 6093

efm32 入门.pdf

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

图论算法-Tarjan之强连通分量

Tarjan--强连通分量

weixin_49289750的博客 1487

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SCC-Tarjan算法,强连通分量算法,从dfs到Tarjan详解

如何一步步从dfs到tarjan算法?

EQUINOX1的博客 2640

浅析强连通分量 Tarjan

写的巨好:源地址 理解 在有向图G中,如果两点互相可达,则称这两个点强连通,如果G中任意两点互相可达,则称G是强连通图。 定理: 1、一个有向图是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次。 2、非强连通有向图的极大强连通子图,称为强连通分量(SCC即Strongly Connected Componenet)。 在上图中,{1,2,3,...

恒持此志成永志 490

tarjan算法求解强连通分量问题

SCC

weixin_61819021的博客 543
上一篇: Tarjan求LCA
Edith_Finch
博客等级 码龄9年 2粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值