Ksaraju算法——图的SCC

news/2025/4/2 12:43:59/文章来源:https://www.cnblogs.com/wxc-cc/p/18803242

算法实现:

  该算法通过两个搜索作为主体实现,第一个搜索来遍历原图的每一个节点,找到强连通分量中任意一个节点,以及其它子图中的顶点。我们将其编号,最大的号入度为0的点,它一定是某子图的顶点,若有多个,则顺序任意,接下来将这个些点去掉,接着找入度为0的点。
我们并不需要真的用到拓扑排序,只需要将每个点进队,dfs结束后队尾为搜索最先遍历到的点。它一定是顶点。这和上面的拓扑思路是一致的,当一个子图结束,进行下一个子图时,虽然当前子图的非顶点会在上一个子图的顶点之后,但是这些点是联通的,我们从后往前遍历,一个子图结束,下一个开始的点一定是下一个子图的顶点。

void dfs1(int u)
{if(vis[u]) return ;    //若该点已经被遍历,则dfs开始回退vis[u]=1;for(int i=0;i<G[u].size();i++){int y=G[u][i];dfs1(y);}s.push_back(u);   //最后的点在前面。
}

  第二个搜索从反图上开始遍历上面找到的点,由于是反图,所以遍历点i时,整个以i为顶点的子图都被困住,在原图上入度为0的,在反图上会直接停在原地,这直接就是一个强连通分量,当i是一个回路,那反图同样是回路,所以整个回路都是一个强连通分量。

void dfs2(int u)
{if(sccno[u]) return ;             //标记,该点以在一个SCC中sccno[u]=cnt;for(int i=0;i<rG[u].size();i++)dfs2(rG[u][i]);
}


整个代码:

void Kosaraju(int n)
{cnt=0;s.clear();memset(sccno,0,sizeof(sccno));memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++)dfs1(i);for(int i=n-1;i>=0;i--)if(!sccno[s[i]]) {cnt++;dfs2(s[i]);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908879.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第5章 编写异步代码

第5章 编写异步代码 5.1 异步函数简介 C# 5 引入了异步函数的概念。异步函数可以指某个由 async 修饰符修饰的方法或者匿名函数,它可以对 await 表达式使用 await 运算符。 5.2 对异步模式的思考 5.2.1 关于异步执行本质的思考 await 在 C#中的任务本质上是请求编译器为我们创…

Spring Cloud Gateway 与 Knife4j 集成实践

注意:写于 2025/1/10,未来时间可能失效,请根据具体情况实践。在微服务架构中,Gateway 通常承担着路由转发、负载均衡、鉴权等职责,而 Knife4j 是一个集 Swagger2 和 OpenAPI3 为一体的增强解决方案,可以帮助开发者快速聚合使用OpenAPI 规范。 本文参考 Knife4j 文档,进行…

用户说:10分钟用通义灵码搞定“今天穿什么”!打开爽文世界……

当我仅用10分钟调教出一个会关心我穿不穿秋裤的管家时,突然想到,现在限制我们开发的已经不是编程能力,而在于你有没有把你的想象力塞进代码框!作者:ZLJ,浙江大学教育技术学研究生 当我仅用10分钟调教出一个会关心我穿不穿秋裤的管家时,突然想到,现在限制我们开发的已经…

Cyber Apocalypse 2025 forensics WP

Cyber Apocalypse 2025 forensics WPCyber Apocalypse 2025 WP 做了国际赛之后虽然(目前只做了两道,可是没环境了啊,前几天比赛有点多~www),只从取证这边说,感觉他们的题很有趣,情境也给的很真实连贯,出题灵活,就是能见到很多新兴的知识,拓展知识面,以后会多看一看…

python第六周作业(第四章课后程序练习题)

4.1 import random def guess_number(): target = random.randint(1, 100) count = 0 while True:guess = int(input("请输入你猜的数字(1-100): "))count += 1if guess < target:print("猜小了")elif guess > target:print("猜大了")else…

win安装oracle19c没有listener

然后就可以看到启动了本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18803159

《HarmonyOS Next开发进阶:打造功能完备的Todo应用华章》

章节 6:日期选择器与日期处理目标学习如何使用DatePicker组件。 理解日期格式化和日期计算。内容日期选择器基础使用DatePicker组件。 处理日期选择事件。日期格式化格式化日期为友好的文本。日期计算判断日期是否过期或即将到期。代码示例 @Entry @Component struct DatePick…

MarkDwon语法

MarkDown语法 1、标题用法 一级标题:#+空格+内容+回车 二级标题:##+空格+内容+回车 三级标题:###+空格+内容+回车 四级标题:####+空格+内容+回车 2、字体用法 粗体使用:快捷键ctrl+b或者内容两边加两个星号,示例 斜体使用:内容两边加一个星号,示例 斜体加粗:内容两边加…

图论(连通分量)

AT_abc284_c [ABC284C] Count Connected Components 题目描述 頂点に $ 1 $ から $ N $ の番号が、辺に $ 1 $ から $ M $ の番号がついた $ N $ 頂点 $ M $ 辺の単純無向グラフが与えられます。辺 $ i $ は頂点 $ u_i $ と頂点 $ v_i $ を結んでいます。 グラフに含まれる連結…

业务系统基础框架-Winform版-角色

角色列表,可刷新,可展开,可折叠编辑角色为角色权限为角色分配菜单查看拥有此角色的账号

3.31 学习记录

实现了使用springboot从文件中读取数据显示在前端

记一次GC导致线上服务超时问题

1、现象2024-12-28 23点左右,线上其他服务请求 content-cache 出现批量超时。content-cache-03 机器内存使用率如下:机器配置:4核8G这里因为JVM参数设置为:-Xms4g -Xmx4g -XX:MaxNewSize=1g所以达到42%时,内存的使用率已经达到了3.3G。 2、数据查看GC日志如下: (1)CMS老…