`
kanpiaoxue
  • 浏览: 1777461 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

DAG图中得到顶点的所有上下游顶点集合

 
阅读更多

在DAG图中得到顶点的所有上下游顶点集合,这个在jgrapht中DirectedAcyclicGraph.java有具体实现。

把它的源代码放在这里,就是为了学习一下API。

/**
 * Get the ancestors of a vertex.
 *
 * @param vertex the vertex to get the ancestors of
 * @return {@link Set} of ancestors of a vertex
 */
public Set<V> getAncestors(V vertex)
{
    EdgeReversedGraph<V, E> reversedGraph = new EdgeReversedGraph<>(this);
    Iterator<V> iterator = new DepthFirstIterator<>(reversedGraph, vertex);
    Set<V> ancestors = new HashSet<>();

    // Do not add start vertex to result.
    if (iterator.hasNext()) {
        iterator.next();
    }

    iterator.forEachRemaining(ancestors::add);

    return ancestors;
}

/**
 * Get the descendants of a vertex.
 *
 * @param vertex the vertex to get the descendants of
 * @return {@link Set} of descendants of a vertex
 */
public Set<V> getDescendants(V vertex)
{
    Iterator<V> iterator = new DepthFirstIterator<>(this, vertex);
    Set<V> descendants = new HashSet<>();

    // Do not add start vertex to result.
    if (iterator.hasNext()) {
        iterator.next();
    }

    iterator.forEachRemaining(descendants::add);

    return descendants;
}

 

 

    public static void test032() throws Exception {
        DirectedAcyclicGraph<String, GoodEdge> dag = new DirectedAcyclicGraph<>(GoodEdge.class);
        dag.addVertex("A");
        dag.addVertex("B");
        dag.addVertex("C");
        dag.addVertex("D");
        dag.addVertex("E");
        dag.addVertex("F");

        dag.addEdge("A", "B");
        dag.addEdge("A", "C");
        dag.addEdge("B", "D");
        dag.addEdge("B", "E");
        dag.addEdge("C", "D");
        dag.addEdge("D", "F");
        dag.addEdge("E", "F");

        dag.edgeSet().forEach(e -> {
            System.out.println(String.format("%s->%s", e.getSource(), e.getTarget()));
        });

        System.out.println(dag.getAncestors("F"));// [A, B, C, D, E]
        System.out.println(dag.getDescendants("B"));// [D, E, F]
    }

 

分享到:
评论

相关推荐

    图论- DAG 的覆盖与独立集.rar

    - 覆盖:在图论中,覆盖是指选取图中的一部分顶点,使得这些顶点通过它们的邻接关系“覆盖”了所有其他的顶点。在 DAG 中,这通常指的是选取一部分顶点,使得每个未被选中的顶点至少有一条入边指向选中的顶点。 - ...

    java实现简单的Dag图

    基于java进行的实现简单Dag图;附件中包含java根据配置的dagJson。1实现了filter过滤,返回指定的字段;2实现了按指定字段排序,返回指定的字段;可以自己添加mysql、Oracle、redis、hive、es、sparksql、clickhouse...

    数据结构课程设计-输出DAG的所有拓扑排序序列-内容与要求.docx

    当图中没有入度为0的顶点时,递归终止,此时已经得到了一个完整的拓扑排序序列。 4. 回溯,恢复之前修改的顶点状态,继续寻找其他拓扑排序序列。 #### 2.4 算法复杂度分析 - **空间复杂度**:\(O(n)\),其中 \(n...

    编译原理DAG的优化

    在编译原理中,DAG(有向无环图,Directed Acyclic Graph)是一种重要的数据结构,常用于表示中间代码,如三地址码或四元式。DAG优化是编译器优化的一个重要阶段,其目标是通过改进程序的结构来提高运行效率,减少...

    由基本块构造DAG图的程序实现(编译原理课设报告)

    输入任意给定的基本块,构造与之等价的DAG图,并以图形方式输出。 基本要求 输入的形式和输入值的范围 以四元式的形式输入任意给定的基本块,即一个字符串,最左边和右边是两个括号(),四个符号之间用三个逗号...

    遍历图中两点之间所有路径的算法

    在遍历两点间所有路径时,我们可以维护一个路径数组来记录当前路径,并在到达目标顶点时将其添加到结果集合中。每次选择一个未访问过的邻接顶点继续探索,直到所有可能的路径都被发现。 以下是一个基本的DFS算法...

    airflow dag之间调用方法.docx

    1. **DAG**: Airflow 中的基本构建单元,表示一系列任务的集合及其执行顺序。 2. **Task**: DAG 中的一个具体步骤,可以是一个简单的命令,也可以是一个复杂的数据处理过程。 3. **Operator**: 用于定义 Task 的类,...

    DAG图网格依赖任务的调度算法

    在调度DAG图任务时,必须确保所有前置任务完成之后才能开始执行一个任务,这增加了调度的复杂性。 在给定的代码中,我们可以看到以下关键组件: 1. **任务和主机对象**:`SG_Resource Host[HOSTNUM]` 和 `SG_Task ...

    数据结构作业之六图图

    此外,图还有其他高级概念,如强连通分量(有向图中任何两个顶点都可以互相到达的子图)、二分图(图的顶点可以分为两组,边仅连接不同组的顶点)以及哈密顿路径和循环(访问图中所有顶点一次并返回起点的路径和循环...

    算法导论生成一个100个点3000条边的有向无环图实验1-4

    分析这个100个顶点3000条边的DAG,我们可以应用多种算法,如拓扑排序(Topological Sort)来确定没有前驱的顶点集合,并按照一定顺序排列所有顶点,或者Kosaraju算法来找出所有的强连通分量。这些算法有助于揭示图的...

    第七章图(3)生成树和最小生成树.pdf

    最小生成树是在连通图中找到边的权重之和最小的树,它包含了所有的顶点,但只有n-1条边。这里提到了两种算法:普里姆算法(Prim's Algorithm)和克鲁斯卡尔算法(Kruskal's Algorithm)。普里姆算法从一个顶点开始,...

    Daggraph一个Android开发者的Dagger依赖关系图生成器

    **Daggraph:Android开发者Dagger依赖关系图生成器** Daggraph是一款专为Android开发者设计的工具,它能够帮助用户生成Dagger依赖注入框架的依赖关系图。Dagger是Google推出的一个流行的Java依赖注入库,广泛应用于...

    数据结构复习题六.doc

    - 有向图中所有顶点的度大于2不一定有回路。 2. **图的搜索算法**: - 深度优先搜索(DFS)常采用递归实现,是一种回溯搜索策略。 - 广度优先搜索(BFS)通常使用非递归方式,如队列来实现。 3. **拓扑排序**: - ...

    dag-to-layers:将 dag 的每个顶点分配给一个图层,插入虚拟顶点

    逐层给定一个有向无环图,应用分层。 返回的值将是一组表示层分配的顶点集。 从每一层传出的边可能只指向来自较早层的顶点。 const toLayers = require ( 'dag-to-layers' )const digraph = require ( 'digraph-tag'...

    6-13算法Tranclo1

    在图论中,传递闭包是指图中从任意一个顶点出发,通过边能到达的所有其他顶点的集合。这个算法主要应用于数据结构和图论领域,特别是在解决依赖关系或者路径传播的问题时。 在这个算法中,首先定义了一个`Graph_...

    卸除DAG(Exchange)

    在Microsoft Exchange Server环境中,数据库可用性组(Database Availability Group,简称DAG)是一种高级的邮件数据库冗余和故障转移解决方案,它允许邮件数据跨多台服务器镜像,从而提高邮件服务的可用性和灾难...

    算法实验:DAG图的最长路径

    算法实验:计算DAG图最长路径并输出。

    图的拓扑排序和有向无环图的判断

    DAG是这两个特性的结合,即图中所有边都是有向的,且不存在环。这种特殊的图结构在许多实际问题中非常有用,因为它允许我们定义和解决一些特定的问题,如任务依赖关系。 接下来,我们讨论**拓扑排序**。拓扑排序是...

    拓扑排序的实现及详解.docx

    什么是拓扑排序对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任 意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性...

    拓扑排序的实现

    它将DAG中的顶点按照一定的顺序排列,使得对于任意一对顶点u和v,如果图中存在一条从u到v的路径,则在拓扑排序后的序列中,u一定排在v前面。拓扑排序的结果通常不唯一,但可以用来检测图中是否存在环。 #### 二、...

Global site tag (gtag.js) - Google Analytics