在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 中,这通常指的是选取一部分顶点,使得每个未被选中的顶点至少有一条入边指向选中的顶点。 - ...
基于java进行的实现简单Dag图;附件中包含java根据配置的dagJson。1实现了filter过滤,返回指定的字段;2实现了按指定字段排序,返回指定的字段;可以自己添加mysql、Oracle、redis、hive、es、sparksql、clickhouse...
当图中没有入度为0的顶点时,递归终止,此时已经得到了一个完整的拓扑排序序列。 4. 回溯,恢复之前修改的顶点状态,继续寻找其他拓扑排序序列。 #### 2.4 算法复杂度分析 - **空间复杂度**:\(O(n)\),其中 \(n...
在编译原理中,DAG(有向无环图,Directed Acyclic Graph)是一种重要的数据结构,常用于表示中间代码,如三地址码或四元式。DAG优化是编译器优化的一个重要阶段,其目标是通过改进程序的结构来提高运行效率,减少...
输入任意给定的基本块,构造与之等价的DAG图,并以图形方式输出。 基本要求 输入的形式和输入值的范围 以四元式的形式输入任意给定的基本块,即一个字符串,最左边和右边是两个括号(),四个符号之间用三个逗号...
在遍历两点间所有路径时,我们可以维护一个路径数组来记录当前路径,并在到达目标顶点时将其添加到结果集合中。每次选择一个未访问过的邻接顶点继续探索,直到所有可能的路径都被发现。 以下是一个基本的DFS算法...
1. **DAG**: Airflow 中的基本构建单元,表示一系列任务的集合及其执行顺序。 2. **Task**: DAG 中的一个具体步骤,可以是一个简单的命令,也可以是一个复杂的数据处理过程。 3. **Operator**: 用于定义 Task 的类,...
在调度DAG图任务时,必须确保所有前置任务完成之后才能开始执行一个任务,这增加了调度的复杂性。 在给定的代码中,我们可以看到以下关键组件: 1. **任务和主机对象**:`SG_Resource Host[HOSTNUM]` 和 `SG_Task ...
此外,图还有其他高级概念,如强连通分量(有向图中任何两个顶点都可以互相到达的子图)、二分图(图的顶点可以分为两组,边仅连接不同组的顶点)以及哈密顿路径和循环(访问图中所有顶点一次并返回起点的路径和循环...
分析这个100个顶点3000条边的DAG,我们可以应用多种算法,如拓扑排序(Topological Sort)来确定没有前驱的顶点集合,并按照一定顺序排列所有顶点,或者Kosaraju算法来找出所有的强连通分量。这些算法有助于揭示图的...
最小生成树是在连通图中找到边的权重之和最小的树,它包含了所有的顶点,但只有n-1条边。这里提到了两种算法:普里姆算法(Prim's Algorithm)和克鲁斯卡尔算法(Kruskal's Algorithm)。普里姆算法从一个顶点开始,...
**Daggraph:Android开发者Dagger依赖关系图生成器** Daggraph是一款专为Android开发者设计的工具,它能够帮助用户生成Dagger依赖注入框架的依赖关系图。Dagger是Google推出的一个流行的Java依赖注入库,广泛应用于...
- 有向图中所有顶点的度大于2不一定有回路。 2. **图的搜索算法**: - 深度优先搜索(DFS)常采用递归实现,是一种回溯搜索策略。 - 广度优先搜索(BFS)通常使用非递归方式,如队列来实现。 3. **拓扑排序**: - ...
逐层给定一个有向无环图,应用分层。 返回的值将是一组表示层分配的顶点集。 从每一层传出的边可能只指向来自较早层的顶点。 const toLayers = require ( 'dag-to-layers' )const digraph = require ( 'digraph-tag'...
在图论中,传递闭包是指图中从任意一个顶点出发,通过边能到达的所有其他顶点的集合。这个算法主要应用于数据结构和图论领域,特别是在解决依赖关系或者路径传播的问题时。 在这个算法中,首先定义了一个`Graph_...
在Microsoft Exchange Server环境中,数据库可用性组(Database Availability Group,简称DAG)是一种高级的邮件数据库冗余和故障转移解决方案,它允许邮件数据跨多台服务器镜像,从而提高邮件服务的可用性和灾难...
算法实验:计算DAG图最长路径并输出。
DAG是这两个特性的结合,即图中所有边都是有向的,且不存在环。这种特殊的图结构在许多实际问题中非常有用,因为它允许我们定义和解决一些特定的问题,如任务依赖关系。 接下来,我们讨论**拓扑排序**。拓扑排序是...
什么是拓扑排序对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任 意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性...
它将DAG中的顶点按照一定的顺序排列,使得对于任意一对顶点u和v,如果图中存在一条从u到v的路径,则在拓扑排序后的序列中,u一定排在v前面。拓扑排序的结果通常不唯一,但可以用来检测图中是否存在环。 #### 二、...