当前位置: 首页 > news >正文

图论17-有向图的强联通分量-Kosaraju算法

文章目录

  • 1 概念
  • 2 Kosaraju算法
    • 2.1 在图类中设计反图
    • 2.2 强连通分量的判断和普通联通分量的区别
    • 2.3 代码实现

1 概念

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2 Kosaraju算法

对原图的反图进行DFS的后序遍历。
在这里插入图片描述
在这里插入图片描述

2.1 在图类中设计反图

// 重写图的构造函数public Graph(TreeSet<Integer>[] adj, boolean directed){this.adj = adj;this.directed = directed;this.V = adj.length;this.E = 0;indegrees = new int[V];outdegrees = new int[V];for(int v = 0; v < V; v ++)for(int w: adj[v]){outdegrees[v] ++;indegrees[w] ++;this.E ++;}if(!directed) this.E /= 2;}// 求反图,并且new一个图对象,参数为TreeSetpublic Graph reverseGraph(){TreeSet<Integer>[] rAdj = new TreeSet[V];for(int i = 0; i < V; i ++)rAdj[i] = new TreeSet<Integer>();for(int v = 0; v < V; v ++)for(int w : adj(v))rAdj[w].add(v);return new Graph(rAdj, directed);}

2.2 强连通分量的判断和普通联通分量的区别

强联通分量是环,意味着在DFS过程中一定是公用相同的联通分量序号。

当这个环遍历从环尾开始返回并记录ccid的时候,DFS自由返回到环, 索引指向下一个未被访问过的环外的节点,此时联通分量序号+1。 由于图是反过来的。

单步调试一下更容易理解。

在这里插入图片描述

2.3 代码实现

顶点:注意这里遍历的顺序是反过来的图。

并且,对翻转过来的图进行DFS后序遍历

        GraphDFS dfs = new GraphDFS(G.reverseGraph());ArrayList<Integer> order = new ArrayList<>();for(int v: dfs.post())order.add(v);Collections.reverse(order);for(int v: order) //注意这里遍历的顺序是反过来的图if(visited[v] == -1){dfs(v, scccount);scccount ++;}

但是在DFS的时候,判断邻边用的是原来的邻接列表。

    private void dfs(int v, int sccid){visited[v] = sccid;for(int w: G.adj(v))if(visited[w] == -1)dfs(w, sccid);}
http://www.lryc.cn/news/230988.html

相关文章:

  • ubuntu中使用 vscode 连接docker开发环境
  • 【广州华锐视点】海外制片人VR虚拟情景教学带来全新的学习体验
  • 龙芯loongarch64麒麟服务器配置yum源
  • Centos7 单用户模式修改密码 3步搞定 666 (百分比成功)
  • 深度学习 机器视觉 车位识别车道线检测 - python opencv 计算机竞赛
  • Java主流分布式解决方案多场景设计与实战
  • docker安装MongoDB数据库,并且进行密码配置
  • ssh脚本找不到命令或者执行无效的解决办法
  • 2023年11月18日(星期六)骑行海囗林场公园
  • xss 漏洞
  • 一文图解爬虫_姊妹篇(spider)
  • 【vue实战项目】通用管理系统:api封装、404页
  • R语言编写代码示例
  • [RK3568][Android12.0]--- 系统自带预置第三方APK方法
  • 数据分析场景下,企业如何做好大模型选型和落地?
  • 使用VScode编译betaflight固件--基于windows平台
  • OkHttp网络请求读写超时
  • @postmapping 定义formdata传参方式
  • Windows客户端开发框架WPF简介
  • 2023NOIP A层联测32 sakuya
  • 竞赛选题 深度学习的视频多目标跟踪实现
  • 金蝶云星空表单插件获取控件值
  • docker自启与容器自启
  • 一、认识微服务
  • Windows server 2012 R2系统服务器远程桌面服务激活服务器RD授权分享
  • Vue的计算属性:让你的代码更简洁高效
  • mysql主从复制-使用心得
  • 今年副业比主业赚得多...
  • debian12安装fail2ban
  • openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144) - 验证