求有向图强连通分量个数

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

https://www.byvoid.com/blog/scc-tarjan/

强连通图(Strongly Connected Graph)是指一个有向图(Directed Graph)中任意两点v1、v2间存在v1到v2的路径(path)及v2到v1的路径的图。

在一个有向图中,其强连通子图(大到不能再大,就是相当于扩张到最大,如强连通子图的强连通子图不算个数)就是他的强连通分量,现在,我们要做的就是求出一个有向图中,他的强连通分量的个数。

1、Kosaraju算法 [邻接矩阵]

该算法可用来计算强连通分量的个数,并收缩强连通分量。

这个算法是最容易理解、最通用的算法,其比较关键的部分是同时应用了原图G和反图G‘。

步骤如下:

one:对原图进行DFS并将出栈顺序进行逆序,得到的顺序就是拓扑顺序;

two:将原图每条边进行反向;

three:按照one中生成顺序在进行DFS染色,染成同色的就是同一个强连通块。

该算法具有一个隐藏性质:如果我们把求出来的每个强连通分量收缩成一个点,并且用每个强连通分量的顺序来标记收缩后的结点,那么这个顺序其实就是强连通分量收缩后形成的有向无环图的拓扑序列。

int G[10][10];
int dfn[10],top;
int color[10],cnt;
void dfs1(int k){
color[k]=1;
for(int i=1;i<=n;i++){
if(G[k][i]!=0&&!color[i])
dfs1(i);
}
dfn[top++]=k;
}
void dfs2(int k){
color[k]=cnt;
for(int i=1;i<=n;i++){
if(G[i][k]!=0&&!color[i])
dfs2(i);
}
}
int main()
{
    top=cnt=0;
for(int i=1;i<=n;i++)
if(!color[i])dfs1(i);
memset(color,0,sizeof(color));
for(int i=n;i>=1;i--){
if(!color[dfn[i]]){
cnt++;
dfs2(dfn[i]);
}
}
cout<<cnt;
    return 0;
}


2、Tarjan算法[邻接表]

int  flag[N];//flag[i]==0表示还没有访问过;1表示访问过,但还没有去掉;-1表示已经去掉了。

int color[N];//color[i]表示定点i所属的强连通分量。

int stack[N];//堆栈,辅助作用。

int low[N];//(很关键)表示与其邻接但还未删除定点的最小访问时间。

int index[N];//顶点的访问时间(像一个标准值,对照用的)

void dfs(int x,int &sig,int &count)    //深搜过程,算法的主要

{

    stack[++top]=x;

     flag[i]=1;

     low[i]=index[i]=++sig;    //初始化

    for(edge *e=adj[x];e!=NULL;e=e->next){

      int v=e->v;

       if(flag[v]==0){

       dfs(v,sig,count );

       if(low[v]<low[x])low[x]=low[v];

     }else if(flag[x]==1&&index[v]<low[x]){low[x]=index[v];}

     }

   if(low[x]==index[x]){

   count++;

   int t;

   do{

       t=stack[top--];

       color[t]=count;

       flag[t]=-1;

     }while(t!=x)

    }

}

int Tarjan()

{

  int sig,count;

memset(flag,0,sizeof(flag) );

sig=count=top=0;

for(int i=1;i<=n;i++)if(flag[i]==0)dfs(i,sig,count);

return count;

}

3、Gabow算法[邻接表]


图论--强连通分量 G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点。如果有向图G的每两个顶点都强连通,称G是一个。关于这道题,首先我们要知道什么是强连通分量:(from百度)有向图强连通分量:在。每个测试用例一行结果,一个正整数:该有向图的强连通分量的个数。给出一个有向图,求该图的强连通分量的个数。 阅读详情

相关推荐

图论:tarjan算法

可以求有向图强连通分量个数,每个强连通分量的节点数等,还可以求割点和桥 强连通图G:G中任意两节点都可以相互到达 强连通分量:G不是强连通图,但G的子图G'是强连通图,则G'为G强连通分量。强连通分量是环。 割点:如果去掉图中节点v及与v相连的边后,图的强连通分量变多了,则v为割点 桥:如果去掉某条边后图的强连通分量变多了,则该条边为桥。 有割点不一定有桥,有桥一定有割点。如C为割点,但...

wangqianqianya的博客 440

强连通分量个数的求法(图解)

强连通分量个数的求法(图解) 背景 最近刷软考题的时候,碰到2013年上半年软件设计师的第31题,求程序图的环路复杂度。答案解析中有这么一段话: 根据图论,在一个强连通的有向图G中,环的个数V(G)由以下公式给出: V(G)=m−n+2p(∗)V(G)=m-n+2p(*)V(G)=m−n+2p(∗) 其中,V(G)是有向图G中的环路数,m是图G中弧的个数,n是图G中的结点数,p是图G中的强连通分量个数。 因为一直习惯了用V=m-n+2的公式计算,所以刚看到(*)公式时有点反应不过来,算是自己学习上的一个

weixin_38327135的博客 2万+

【图论】Tarjan算法(强连通分量)

Tarjan算法是一种由美国计算机科学家罗伯特·塔杨(Robert Tarjan)提出的求解有向图强连通分量的线性时间的算法。

muyangquan0013的博客 1877

强连通分量的个数(Kosaraju)

【题目描述】 求一个有向图中强连通分量的个数。 【解题思路】 先解释一下强连通分量的定义: 一个有向图中,如果每两个点都相互连接(可以不直达),那么这个图就是一个强连通,我们可以把一个有向图分解成若干个强连通分量。 那么我们应该怎么做呢? 首先,从任意一个点开始遍历,记录每个点出栈的顺序。 原理,但我们对一个图进行dfs遍历的时候,我们从最深层开始出栈,如果我们把一个点的出度看作是通往下一层的话,那么我们最先出栈的肯定就是没有出度的了,当一个点的所有出度的点全部出栈了,那么我们也可以看作这个点的出度

FKJDASOI的博客 3576

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

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

六天 1406

csp-j/s

CSP-J/S 是中国计算机学会(CCF)主办的 ‌‌(Certified Software Professional Junior/Senior),是信息学奥赛(NOI)体系的入门级选拔考试,也是国内最具权威性的青少年编程能力认证之一。

gxyxxrYYDS的博客 2029

强连通分量

强连通分量@(算法学习)首先明白,这个概念是在有向图中的,其次是,如何有效寻找。图中强连通分量的个数是:4个。分析: 强连通分量的定义:有向图中,如果两个顶点vi,vjv_i,v_j之间存在: viv_i到vjv_j的路径 vjv_j到viv_i的路径 则称这两个顶点是强连通的。至于相对的弱连通,则抹去方向,相连即可。那么,道理很简单,如何应用呢?答案是先找回路,然后在回路的基础上,扩展结点。因为

Bing's Blog 2868

Vue中实现word文档渲染、在线编辑、保存

Vue3对word文档进行渲染、编辑、保存。word转成html,html转成word

h18749849699的博客 1329

【图论】强连通分量 tarjan UOJ#146

题目链接:http://uoj.ac/problem/146 求强连通分量的个数 。 1.有向图中: 强连通:两个节点可以互相到达 强连通图:图中的任意两点都可以互相到达也即任意两点都是强连通 强连通分量:图中的子图是强连通图 2.Tarjan算法:用来求有向图的强连通分量。基于DFS算法,每个强连通分量为搜索树中的一颗子树。 搜索时,把当前图中未处理的点加入一个堆栈,回溯时可以栈顶...

weixin_43719720的博客 201

保姆级教程:在Windows 11上用VSCode和Conda搞定Depth-Anything-3(含常见报错修复)

本文提供在Windows 11系统上使用VSCode和Conda配置Depth-Anything-3的完整教程,涵盖环境搭建、依赖安装、常见报错修复及深度图生成实战。特别针对CUDA与PyTorch版本匹配、Hugging Face镜像加速等关键问题提供解决方案,帮助开发者高效实现计算机视觉中的深度估计应用。

weixin_30338481的博客 347

VCSA的vmware-updatemgr服务无法启动和vSAN界面报“certificate chain is not trusted and thumbprint doesn‘t match”处理

"Unable to update CM service info"和"Server certificate chain is not trusted and thumbprint doesn't match"问题处理

jetliu05的博客 1884

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

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

diansitao5461的博客 108

交叉熵损失函数基本概念及公式

对于二分类问题,模型的输出通常是一个标量,表示样本属于正类的概率。因此,在二分类的交叉熵损失函数中,我们只需要考虑一个概率值,即模型预测为正类的概率。具体来说,当真实标签为1时,我们关注模型预测为正类的概率;当真实标签为0时,我们关注模型预测为负类的概率。因此,二分类的交叉熵损失函数可以表示为:其中,y 表示真实标签,取值为 0 或 1;p 表示模型预测为正类的概率。而对于多分类问题,模型的输出通常是一个向量,表示样本属于各个类别的概率。因此,在多分类的交叉熵损失函数中,我们需要考虑所有类别的概率。

qlkaicx的博客 1万+

C++有向图的强连通分量—————Summer Holiday

题目描述: To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Infinity in the palm of your hand And Eternity in an hour. —— William Blake 听说lcy帮大家预定了新马泰7日游,Wiskey...

C2020lax的博客 934

谷歌A2A协议入门指南:附简易Python代码示例

继"关税"之后,当下最热门的词汇当属AI智能体——这种基于人工智能的软件能够执行复杂任务、实现工作流自动化并提升生产效率。但迄今为止,大多数智能体都处于各自为政的状态,难以顺畅协作。就像团队执行重大项目时,成员之间却无法交流!对于技术人员而言,一个可能遇到的典型场景是:假设你需要协调四个不同的AI服务——处理用户查询的Gemini智能体、在向量数据库进行搜索的AI应用、基于Claude的摘要生成器,以及运行专业领域逻辑的Python智能体。

独立开发,substack顶级编辑 799

粒子群优化与蚁群算法求解多旅行商问题

它要求在给定一组城市和旅行商之间的距离矩阵的情况下,找到一条最优的路径方案,使得所有旅行商可以分别从起始城市出发,途径其他城市,并最终回到起始城市,同时总旅行距离达到最小。这两种算法都是基于群体智能的优化算法,在求解组合优化问题时具有较好的性能表现。假设有n个城市需要被m个旅行商访问,城市间的距离由距离矩阵D表示,其中D(i,j)表示第i个城市到第j个城市的距离。粒子群优化算法是一种基于群体智能的优化算法,其中的粒子代表了潜在的解,并通过模拟粒子在解空间中的移动来搜索最优解。一、多旅行商问题建模。

m0_47037246的博客 553

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

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

flymoyu的博客 419

康复训练监测系统:基于YOLOv8的患者动作规范识别

本文系统介绍了基于YOLOv8的康复训练动作规范识别系统,从理论背景、数据准备、模型训练、推理应用到UI界面,提供了完整技术链条及代码示范。希望对康复领域的智能监测应用提供参考和借鉴。

YOLO 453

求有向图强连通分量—Tarjan's Algorithm

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

pcc386115710的博客 722

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OV9734 DATASHEET,完整规格书

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

【数据结构】求有向图强连通分量的方法

求有向图强连通分量的方法

triticale的博客 641

Camera2Demo

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

对求有向图强连通分量的tarjan算法原理的一点理解

Tarjan算法正确性的详细证明

naturerun的博客 981

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Tarjan求无向图割点,割边,双连通分量;求有向图强连通分量,缩点

为了与有向图尽可能保持一致,我们将无向图的一条无向边拆分成两条单向边。两条边互为反向边。 从图中一点作为起点,进行DFS搜索遍历图,这样会得到一棵树,我们称之为DFS搜索树,该树中的每一条边都来自原图,我们将这些边称为树边,其他图中的边称为非树边。 dfn数组:记录dfs序,也即时间戳、搜索顺序。 low数组:记录每个点经过一条非树边能回到的所有结点的最小dfn值。 tarjan求割点: x是割点 case1:x不是root&&x有儿子&&low[y]>=df

qq_55788328的博客 999

有向图_十字链表存储结构_深度优先遍历_求有向图的强连通分量

目录 0.小结 基于遍历地求无向图的连通分量和求有向图的强连通分量 1.有向图的十字链表存储结构 2.有向图的正向(顺箭头)深度优先遍历:递归的退出:最后完成搜索的顶点 求有向图的强连通分量的步骤1: 3.有向图的逆向(逆箭头)深度优先遍历:求有向图的强连通分量。 求有向图的强连通分量的步骤2: 概念:在有向图G中,如果对于每一对v1,vj属于V,vi不等于vj,从vi到vj和从vj...

m0_37357063的博客 1333

「Tarjan」有向图强连通分量

内容 tarjan求解有向图强连通分量 tarjan求无向图割点与桥, tarjan解决2-SAT问题 Tarjan求有向图强连通分量 学习资源 https://www.bilibili.com/video/BV19J411J7AZ?spm_id_from=333.337.search-card.all.click 算法竞赛进阶指南-lyd 一些结论 有向图Tarjan缩点后图为拓扑图且与连通分量相反 有向图转化为强连通分量图需要加 max(p,q)max(p,q)max(p,q) 条边,其中pp

nttttt の blog 528

求有向图强连通分量的几种方法

kosaraju算法 翻转图G,两次深搜,遍历连接,后历入栈; 任意有向图G,对其边方向翻转产生图GREV,对于G任意节点开始进行DFS,先遍历后节点入栈S, DFS(vertex v) { DFS(V->NEXT); PUSH V IN S; } 直至所有节点入栈后将栈顶元素推出作为起点,对GREV进行DFS,先出栈再遍历节点, DFS(vertex v) {...

ringo优快云的博客 1921
上一篇: WIKIOI 1213 解的个数 题解与分析
下一篇: wikioi 2822 爱在心中
thy0311
博客等级 码龄12年 3粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值