有向图—拓扑排序,Kosaraju算法

算法——图之有向图 我们主要讨论一下方面: 1.有向图的表示 有向图的可达性 有向图的路径 2. 判断有向图中是否有环 拓扑排序,优先级限制下的调度问题 3. 有向图的强连通性 有向图的可达性 有向图的表示 和无向图中的一样,我们也采用邻接表矩阵的方式来表示有向图。只需要修改addEdge方法,只增加一条边,而不是增加双向边就可以了。 public class DiGraph 阅读详情

有向图基本算法

  1. 对于有向图的结构,和无向图类似,甚至更简单,有疑问请留言。
    1>有向图的数据结构
package graphTheory;
/**
  * @author luoz 
  * @date 2016年9月19日 下午9:26:21 
**/
public class Digraph {

    private final int V;
    private int E;
    private Bag<Integer>[] adj;

    public Digraph(int V)
    {
        this.V = V;
        this.E = 0;
        adj = (Bag<Integer>[])new Bag[V];
        for(int i = 0;i<V;i++)
            adj[i] = new Bag<>();
    }

    public int V()
    {
        return V;
    }
    public int E()
    {
        return E;
    }

    public void addEdge(int v,int w)
    {
        adj[v].add(w);
        E++;
    }

    public Iterable<Integer> adj(int v)
    {
        return adj[v];
    }

    public Digraph reverse()
    {
        Digraph g = new Digraph(V);
        for(int j = 0; j<V;j++)
            for(int w : adj[j])
                g.addEdge(w,j);
        return g;
    }
}
  1. 基于深度优先遍历的顶点排序
    1>前序:在递归调用之前将顶点加入队列;
    2>后序:在递归调用之后将顶点加入队列;
    3>逆后序:在递归调用之后将顶点压入栈;
package graphTheory;

import java.util.*;
import javax.management.Query;

/**
  * @author luoz 
  * @date 2016年9月19日 下午10:11:48 
**/
public class DepthFirstOrder {

    private boolean[] marked;
    //pre order
    private Queue<Integer> pre;
    //postorder
    private Queue<Integer> post;
    //reverse postorder
    private Stack<Integer> repost;

    public DepthFirstOrder(Digraph g)
    {
        marked = new boolean[g.V()];
        pre = new LinkedList<>();
        post =  new LinkedList<>();
        repost = new Stack<>();
        for(int i = 0;i<g.V();i++)
            if(!marked[i])
                dfs(g,i);
    }

    private void dfs(Digraph g,int v)
    {
        pre.add(v);
        marked[v] = true;
        for(int w : g.adj(v))
            if(!marked[w])
                dfs(g,w);
        post.add(v);
        repost.add(v);
    }

    public Iterable<Integer> pre()
    {
        return pre;
    }

    public Iterable<Integer> post()
    {
        return post;
    }

    public Iterable<Integer> reversepost() {
        return repost;
    }
}
  1. 检测有无环
package graphTheory;

import java.io.File;
import java.util.Stack;

/**
  * @author  luoz 
  * @date 2016年9月19日 下午9:48:41 
**/
public class DirectedCycle {

    private boolean[] marked;
    private int[] edgeTo;

    //All vertices of a directed loop
    private Stack<Integer> cycle;
    //resursion all vertices of the cycle 
    private boolean[] onStack;

    private boolean marked(int v)
    {
        return marked[v];
    }

    public boolean hasCycle()
    {
        return cycle != null;
    }

    public DirectedCycle(Digraph g)
    {
        marked = new boolean[g.V()];
        edgeTo = new int[g.V()];
        onStack = new boolean[g.V()];
        for(int i = 0;i<g.V();i++)
            if(!marked[i])
                dfs(g,i);
    }

    private void dfs(Digraph g,int v)
    {
        marked[v] = true;
        onStack[v] = true;
        for(int w : g.adj(v))
        {
            if(this.hasCycle())
                return;
            else if(!marked[w])
            {
                edgeTo[w] = v;
                dfs(g,w);
            }
            else if(onStack[w])
            {
                cycle = new Stack<Integer>();
                for(int i = v; i != w; i = edgeTo[i])
                    cycle.push(i);
                cycle.push(w);
                cycle.push(v);
            }
            onStack[v] = false;
        }       
    }

    public Iterable<Integer> cycle()
    {
        return cycle;
    }
    /*测试代码,从文件中读取的,可以自己写测试代码*/
    public static void main(String[] args) {
        FileIo fileio = new FileIo();
        String s = fileio.characterReader(new File("cycle.txt"));
        String[] st = s.split(",");

        Digraph g = new Digraph(13);

        int E = st.length;
        for(int i = 0;i<E;i++)
        {
            String[] str = st[i].split(" ");
            g.addEdge(Integer.parseInt(str[0]),Integer.parseInt(str[1]));           
        }
        DirectedCycle cc = new DirectedCycle(g);
        System.out.println(cc.hasCycle());
        System.out.println(cc.cycle);
    }

}

拓扑排序

拓扑排序只针对有向无环图。
一幅有向无环图的拓扑排序,也就是所有顶点的逆后序排列。

package graphTheory;

/**
  * @author  luoz
  * @date 2016年9月20日 上午8:30:05 
**/
public class Topological {

    private Iterable<Integer> order;

    public Topological(Digraph g)
    {
        DirectedCycle hascycle = new DirectedCycle(g);
        if(!hascycle.hasCycle())
        {
            DepthFirstOrder df = new DepthFirstOrder(g);
            order = df.reversepost();
        }   
    }

    public Iterable<Integer> order()
    {
        return order;
    }
}

Kosaraju算法

计算强连通分量的算法。
主要运用了图G的反转和顶点排序的逆后序。

package graphTheory;
/**
  * @author  luoz
  * @date 2016年9月20日 上午9:08:53 
**/
public class KosarajuSCC {

    private boolean[] marked;
    private int[] id;
    private int count;

    public KosarajuSCC(Digraph g)
    {
        marked = new boolean[g.V()];
        id = new int[g.V()];
        //
        DepthFirstOrder df = new DepthFirstOrder(g.reverse()); 
        for(int i : df.reversepost())  
            if(!marked[i])
            {
                dfs(g,i);
                count++;
            }
    }
    private void dfs(Digraph g,int v)
    {
        marked[v] = true;
        id[v] = count;
        for(int w :g.adj(v))
            if(!marked[w])
                dfs(g,w);
    }
    public int count()
    {
        return count;
    }

    public boolean connected(int v,int w)
    {
        return id[v] == id[w];
    }
}

算法第四版

Coding Plan:程序员真实工作的可执行编码决策框架 Coding Plan 是一种面向工程实践的编码决策方法论,它超越传统学习路径,聚焦于代码在真实业务系统中的上下文对齐、影响控制与可演进性保障。其核心在于将模糊的开发直觉转化为可度量、可验证、可协作的日常动作,涵盖目标对齐、上下文锁定、验证闭环、协作契约和演进预留五大锚点。结合2026年AI辅助编码新范式,它强调将大模型作为‘上下文翻译器’而非代码生成器,并通过分钟级工作块、技术债主动发行、可观测性前置等机制,显著提升交付确定性与系统长期健康度。本文详解该框架的底层逻辑与落地实践。 阅读详情

相关推荐

OCCT(Open CASCADE Technology)入门-2.搭建开发环境

安装完成后,在【扩展】菜单下会看到【Qt VS Tools】菜单,打开子菜单【options】进入qt配置窗口。打开VS后随便创建一个新项目,进入开发环境主页,打开顶部菜单【扩展】->【管理扩展】打开管理扩展窗口。然后点击右下角【创建】,一路【next】即可,最后会进入到开发主界面,得到一个下面的工程结构。好了,到这里基本的环境我们已经安装好了,下面我们开始创建项目并配置开发环境。打开顶部菜单【项目】,点击最后一个菜单项【xxx属性】,进入项目配置界面。这里的配置一般不用改,我们看【Versions】

2501_91235145的博客 2876

有向图拓扑排序

有向图拓扑排序 前言 本文介绍有向图拓扑排序算法的思路及代码实现,首先讲解什么是拓扑排序,其次介绍实现拓扑排序需要的检测有向图是否有环的算法及顶点排序算法,最终实现有向图的拓扑排序。 一、什么是拓扑排序? 给定一副有向图,将所有的顶点排序,使得所有的有向边均从排在前面的元素指向排在后面的元素,此时就可以明 确的表示出每个顶点的优先级。如对下图进行拓扑排序: 拓扑排序结果为: 根据拓扑排序的概念,如果对有向图进行拓扑排序,那么图中必须没有环,否则,就不能进行拓扑排序,然后在图中无环的情况下,再进行顶点排

Mekeater的博客 1万+

别再踩坑了!CAPL脚本里局部变量和全局变量的那些“怪事”(附CANoe实测代码)

本文深度解析CAPL脚本中局部变量和全局变量的特殊机制,揭示其与通用编程语言的差异。通过实测代码展示静态局部变量的默认行为和全局变量的节点隔离特性,并提供高效避坑指南,帮助汽车网络测试工程师避免常见陷阱。

weixin_30225755的博客 294

基于有向图的拓扑排序(Java实现)

目录1 概念及推导1.1 引入1.2 概念1.3 检测有向图中的环1.4 基于深度优先的顶点排序4 拓扑排序实现 1 概念及推导 1.1 引入 在生活中,很多事情都讲求循序渐进。以学习java为例,需要从java基础,到jsp/servlet,到ssm,再到springboot等,是一个循序渐进且有依赖的过程。 为了简化问题,我们使用整数为顶点编号的标准模型来表示这个案例: 要学习这些课程,就需要指定一个循序渐进的方案,即对图中的顶点进行排序,将其转换为一个线性序列,这时就需要用到一种叫拓扑排序的算法。

sc179的博客 1687

数据库1:数据库创建与管理(头歌云课)

在 Windows 系统中,可以直接通过 SQLServer 的应用程序连接数据库,不过很多时候在生产环境下,我们需要通过命令行来连接数据库。两个数据库,数据库名分别为 TestDb 和 MyDb 的数据库,注意先后顺序。为了完成本关任务,你需要掌握:1.如何在 Linux 系统中连接 SQLServer 数据库,2.如何创建数据库。连接的数据库是本地数据库,用户名是 sa ,密码是 '

weixin_60530224的博客 2315

ESD放电模式以及电源箝位 (power clamp )电路

由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工作将输出端Vout电压上拉到高电位。从而Vg端的高电位触发导通了NMOS元件(Mesd)的晶体管,因而ESD电流便经由Mesd而泄放掉。由于晶体管Mesd的栅极导通

DOG_BITE_DOG的博客 2万+

数据结构与算法——有向图的拓扑排序

数据结构与算法——拓扑排序 在有向图中,用顶点表示活动,用有向边<Vi,Vj>表示活动i是活动j的必须条件,这种有向图为顶点表示活动的网简称为AOV网络。 在AOV网络中,如果活动Vi 必须在Vj 之前进行,则存在有向边<Vi,Vj>,并称Vi是Vj的直接前驱,Vj是Vi的直接后继;这种前驱与后继的关系具有传递性和反自反性,这要求AOV网络中不能出现回路,即有向环;因此,对于给定的AOV网络,必须判断它是否存在有向环。 拓扑排序描述   检测有向环可以通过对AOV网络进行拓扑

qq_25065595的博客 5416

电源完整性之Cadence Sigrity Power DC_IR_Drop仿真

之前和大家分享过电源完整性之仿真设计原理链接: link.今天接着上一篇文章总结一下电源直流压降的的仿真操作流程及一些simulation中的设置参数,用到的时候Cadence Sigrity 中的Power DC组件,下面开始享受仿真的快乐吧: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的Power DC组件,然后先择licence,最后就可以打开我们之前转化好的.SPD文件。操作如下图: 2.设置层叠信息和过孔焊盘参数 层叠信息:每层的介质厚度、材料、介电常数、介质损耗角等,如

刘小同学的博客 1万+

图综合练习--拓扑排序_图解:有向环、拓扑排序与Kosaraju算法

图算法第三篇 图解:有向环、拓扑排序与Kosaraju算法 首先来看一下今天的内容大纲,内容非常多,主要是对算法思路与来源的讲解,图文并茂,希望对你有帮助~1.有向图的概念和表示 概念有向图与上一篇文章中的无向图相对,边是有方向的,每条边所连接的两个顶点都是一个有序对,它们的邻接性都是单向的。 一幅有方向的图(或有向图)是由一组顶点和一组有方向的边组成的,每条有方向的边都连接着一对有序的顶点。...

weixin_39633954的博客 645

PDAF相位对焦原理

pdaf光路图

camerall 1万+

从数字后端角度谈谈occ电路(一)

摘要:本文介绍了芯片测试中OCC(On-Chip Clock Control)电路的设计与应用。随着工艺进步,芯片制造面临Stuck-at、Bridging和Delay等故障类型,需要不同时钟频率进行测试。OCC电路通过Clock Selection、Clock Chopping Control和Clock Gating三个模块,实现ATE时钟与PLL时钟的切换控制,支持慢速时钟检测Stuck-at故障和快速时钟检测Delay故障。文章详细解析了OCC电路结构及各模块功能,包括同步单元、移位寄存器等关键组件

芯冰乐 586

有向图的拓扑排序

当有向图中,某个点的入度为 0 的时候,说明是没有一个点指向这个点的,那这个点就能作为起点指向其他点了,遍历结束后,这个点就可以删掉了(将 t 放在当前的最前面了),并将它指向的所有点的入度都减 1。此题只需要记录每个人物最快完成的时间即可:将所有入度为 0 的点放入队列,然后遍历所有出边,将遍历到的点的入度都减1,当一个点的入度减到 0 的时候,就可以加入队列。比如:生成一个可执行程序,需要经历预处理,编译,汇编,链接四步,后面的步骤必须在前面的步骤完成后才能执行。

纪宁的博客 818

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(五)(含2022年和2023年)

此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章)

qq_42135020的博客 2083

[Java]-有向图(拓扑排序,kosaraju算法)

原文链接 有向图 在有向图中,边是单向的,每条边所连接的两个顶点是一个有序对,这种邻接性是单向的 定义: 一幅有方向性的图(有向图),由一组顶点和有方向的边组成,每条有向边都连接着一组有序对。 有向环 一条至少含有一条边且起点和终点相同的有向路径。简单有向环是一条(除了起点终点相同)不含有重复顶点和边的环。 路径或环的长度即为边的数量 有向图的代码实现: package cn.ywrby.Gra...

renboyu010214的博客 2127

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

有向图算法总结(含完整C++代码)

有向图类,拓扑排序,强连通分量,任意两点可达性

2301_80189196的博客 2016

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

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

有向图中寻找强连通分量(环)和拓扑排序——Kosaraju、Trajan、Gabow算法

有向图中寻找强连通分量(环)和拓扑排序——Kosaraju、Trajan、Gabow算法

满天繁星 3204

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《算法4》有向图 (二、有向无环图(DAG) | 拓扑排序 | 强连通分量(Kosaraju))

基于《算法4》的描述,在之前有向图数据结构基础上,实现有向无环图(DAG)、拓扑排序、强连通分量(Kosaraju)算法; 一些概念 有向无环图(DAG):不含有环的有向图;拓扑排序: 给定一幅有向图,使得有向边均从排在前面的元素指向排在后面的元素; 当且仅当,有向无环图才可以做拓扑排序; 常用于任务调度、课程安排...等解决方案;强连通分量(Kosaraju): 顶点v和顶点w互相可达为连通性; 顶点之间可达的最大子集,就是强连通分量; 一、有向无环...

小小绿豆的专栏 1168

Kosaraju算法+Trajan算法

先来看看什么是强连通图? 强连通图就是有向图中任意两点都能是互相可达的。 一个有向图可以分成多个子图,如果某个子图内部是强连通的,并且已经扩展到了最大,即该子图中的任意一点不与子图外的任意一点连通,则称这个子图为该有向图的一个强连通分量,简称SCC。 一个常见的问题就是如果就一个有向图的SCC个数? 这两种算法都可以用来解决有向图的强连通分量的个数。 Kosaraju算法 基于DFS的拓扑排序代码: void dfs1(int x) { for(int i = 0; i < a[x].size();

qq_46653910的博客 194

《算法》-图[有向图]

有向图 简单的来说有向图就是连接带方向的图。有向图的例子在现实生活中也很多,比如在一段时间内银行间的现金流动,或者在某些地方的一些道路是单向的啊,那么这些现金流以及单向的道路就要用带方向的边来描述,这时有向图就有了用武之地。一个有向图的例子如下: 有向图该怎么实现呢?,对于无向图我们使用邻接表来实现,这种表达方式非常高效,并且略加思考就可以发现,邻接表完全可以直接套用在有向图上。假设要添加一条v->w的边,只要每次调用add()函数的时候只在adj[v]所指向的Bag添加w即可,这么看来无向图可以看

m0_37748303的博客 1067

图表算法—有向图

1. 有向图(Directed Graphs)   有向图与无向图是很像的,如果对无向图不熟悉,建议先看一下无向图。   在讨论有向图的算法前,先讨论如何构建有向图。   构建有向图的方法基本与无向图的方法一模一样。     首先,有向图是长这样的:         也是有两个关键点:   a. 这个有向图有哪些点   b. 哪些点可以通往哪些点(箭头代表可通往的...

777

有向图

1. 有向图的数据类型 1.1 有向图的表示 有向图的表示和无向图的表示基本无差,只是在add()方法不再是对称添加,且新加了reverse方法反转图 package GraphPag; import java.util.Iterator; public class DiGraph { private Vertex[] verticesList;//邻接表数组 private ...

Javaer`s blog 2197

2023-04-09 有向图及相关算法

定义:在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点,最终的排序结果就是拓扑排序价值:当现实中存在图状约束时,要你给出一个约束下可行的图遍历方便,这个时候拓扑排序就用上了~比如选课、选旅游路线等floodfill最小生成树桥和割点二分图检测。

lsgwr的博客 2586

Algorithms_4th学习: 4.2 有向图(Directed Graphs)

有向图(Digraph)就是"边有方向"的图。应用场景 顶点含义 边的含义食物链 物种 捕食关系(A 吃 B)互联网网页 网页 超链接(A 链接到 B)程序模块 模块 调用关系(A 调用 B)学术论文 论文 引用关系(A 引用 B)手机通话 手机号 通话(A 打给 B)金融交易 账户 转账(A 转给 B)无向图 vs 有向图的核心区别无向图:A - B (A 和 B 互通,可以双向走)有向图:A -> B (只能从 A 走到 B,不能从 B 走到 A)有向图:顶点的集合 + 有向边的集合。

虾球 181

算法 4.2节 有向图中环的判定以及Kosaraju算法实现强连通分量

//有向图判定 import java.util.Stack; public class DirectedCircle { private boolean[] marked; private boolean[] onStack; private int[] edgeTo; private Stack&lt;Integer&gt; circle; publ...

firefly 302

《算法4》有向图与DAG与Kosaraju算法

有向图在我的上一篇博客《算法4》图&深度优先与广度优先算法中,我介绍了简单的无向图,以及相关的两大搜索方法:深度优先和广度优先搜索,这里我要介绍新的数据结构:有向图。简单的来说有向图就是连接带方向的图。有向图的例子在现实生活中也很多,比如在一段时间内银行间的现金流动,或者在某些地方的一些道路是单向的啊,那么这些现金流以及单向的道路就要用带方向的边来描述,这时有向图就有了用武之地。一个有向图的例子如下

leonliu1995的博客 1238

十六、图算法之有向图

有向图有向图的数据结构采用链表public class Digraph { private static final String NEWLINE = System.getProperty("line.separator"); private final int V; // number of vertices in this digraph privat

guanhang89的专栏 6511
上一篇: 图算法(二)—深入理解广度优先搜索
下一篇: 最小生成树—Prim算法和Kruskal算法
luoz_python
博客等级 码龄10年 57粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值