news 2026/9/6 20:10:46

Kosaraju强连通分量算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kosaraju强连通分量算法

Kosaraju算法是求有向图强连通分量的经典算法,这个算法在算法导论第三版22.5节有详细介绍(包括正确性证明),这里简要回顾一下算法流程

Kosaraju算法流程(针对有向图G)
1.对G进行深度优先搜索,遍历完每一个顶点的dfs树后(此时该顶点变为黑色),将每一个顶点按变成黑色的逆序放入finish_time数组
2.求出G的转置图G’
3.利用finish_time选取G’中尚未被dfs访问的顶点中完成时间最大的顶点,从该顶点出发dfs,访问到的顶点构成一个强连通分量.重复该步骤,当G’中所有顶点均被访问完毕后就获得了所有的强连通分量

C++代码(简单易懂,就不注释了)

#include<iostream>#include<vector>#include<queue>#include<set>usingnamespacestd;#include"graph.h"constintN=6;voiddfs(size_t cur,Graph&_graph,vector<bool>&visited,vector<size_t>&finish_time,size_t&i){visited[cur]=true;for(EdgeNode*run=_graph.getFirstEdge(cur);run!=nullptr;run=_graph.nextEdge(run)){if(visited[run->vertex_id]==false){dfs(run->vertex_id,_graph,visited,finish_time,i);}}finish_time[--i]=cur;}voiddfs_on_t_graph(size_t cur,Graph&_graph,vector<bool>&visited,vector<set<size_t>>&SCC){visited[cur]=true;SCC.back().insert(cur);for(EdgeNode*run=_graph.getFirstEdge(cur);run!=nullptr;run=_graph.nextEdge(run)){if(visited[run->vertex_id]==false){dfs_on_t_graph(run->vertex_id,_graph,visited,SCC);}}}intmain(){Graphg(N);Graphg_reverse(N);vector<pair<size_t,size_t>>edge{{0,1},{0,2},{1,3},{2,3},{2,4},{3,0},{3,5},{4,5}};for(constauto&p:edge){g.insertEdge(p.first,p.second);g_reverse.insertEdge(p.second,p.first);}vector<bool>visited(N,false);vector<size_t>finish_time(N);size_t j=N;for(size_t i=0;i<visited.size();++i){if(!visited[i]){dfs(i,g,visited,finish_time,j);}}vector<set<size_t>>SCC;SCC.reserve(N);visited.assign(visited.size(),false);for(size_t i=0;i<finish_time.size();++i){if(visited[finish_time[i]]){continue;}SCC.push_back(set<size_t>());dfs_on_t_graph(finish_time[i],g_reverse,visited,SCC);}for(size_t i=0;i<SCC.size();++i){cout<<"第"<<i+1<<"个强连通分量"<<endl;for(constauto&p:SCC[i]){cout<<p+1<<" ";}cout<<endl;}return0;}

graph.h内容

#pragmaonce#include<vector>structEdgeNode{size_t vertex_id;EdgeNode*next=nullptr;EdgeNode(size_t&v):vertex_id(v){}};classGraph{public:Graph(constsize_t&N):vertex_list(N,nullptr){};~Graph();boolinsertEdge(size_t u,size_t v){if(u!=v&&u<vertex_list.size()&&v<vertex_list.size()){if(vertex_list[u]==nullptr){vertex_list[u]=newEdgeNode(v);}else{EdgeNode*t=newEdgeNode(v);t->next=vertex_list[u];vertex_list[u]=t;}returntrue;}returnfalse;}booldeleteEdge(size_t u,size_t v){if(u!=v&&u<vertex_list.size()&&v<vertex_list.size()){if(vertex_list[u]==nullptr){returnfalse;}EdgeNode*run=vertex_list[u];EdgeNode*pre=nullptr;while(run!=nullptr){if(run->vertex_id==v)break;pre=run;run=run->next;}if(run==nullptr){returnfalse;}if(pre==nullptr){vertex_list[u]=run->next;}else{pre->next=run->next;}deleterun;returntrue;}returnfalse;}EdgeNode*getFirstEdge(size_t u){returnvertex_list[u];}EdgeNode*nextEdge(EdgeNode*cur){if(cur==nullptr)returnnullptr;returncur->next;}private:vector<EdgeNode*>vertex_list;};Graph::~Graph(){if(vertex_list.empty())return;for(size_t i=vertex_list.size()-1;;--i){EdgeNode*run=vertex_list[i];while(run!=nullptr){vertex_list[i]=run->next;deleterun;run=vertex_list[i];}vertex_list.pop_back();if(i==0)break;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 20:10:37

基于GPU的SAR后向投影成像优化与CUDA加速实践

简介&#xff1a;这是一份关于利用GPU加速后向投影SAR成像算法的学术论文&#xff0c;面向雷达信号处理、高性能计算与SAR成像领域的研究人员、工程师及高年级学生。压缩包内共1个PDF文件&#xff0c;大小约1.21MB&#xff0c;即论文全文。论文首先阐述了后向投影算法的基本原理…

作者头像 李华
网站建设 2026/9/6 20:07:27

4 个算法免费搞定视频超分与插帧:Video2X 使用指南

4 个算法免费搞定视频超分与插帧&#xff1a;Video2X 使用指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/video2x …

作者头像 李华
网站建设 2026/9/6 20:06:02

Buzz 离线语音转文字实战:从会议录音到批量字幕,一次跑通

Buzz 离线语音转文字实战&#xff1a;从会议录音到批量字幕&#xff0c;一次跑通 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz …

作者头像 李华
网站建设 2026/9/6 20:04:22

基于74HC138的3-8译码器设计:原理、电路搭建与级联扩展

简介&#xff1a;围绕74HC138芯片展开的3-8译码器设计报告文档&#xff0c;面向数字集成电路课程设计、硬件电路设计初学者及电子工程相关学生&#xff0c;系统介绍了从功能分析、逻辑设计到电路实现与版图规划的完整流程。包体为单个DOC文件&#xff0c;大小约1.05MB&#xff…

作者头像 李华
网站建设 2026/9/6 20:04:22

Umi-OCR 快速上手指南:5分钟用免费离线OCR工具识别截图与PDF文字

Umi-OCR 快速上手指南&#xff1a;5分钟用免费离线OCR工具识别截图与PDF文字 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内…

作者头像 李华