假设我有以下两个树图:
a i
/ \ / \
b c j k
/ \ / \ / \ / \
d e f g l m n o
我需要从第一个图中提取子图<code>b</code>并将其替换为第二个图,如下所示:
i
/ \
j b
/ \ / \
l m d e
JGraphT中是否有任何现有的API允许这样做?
以下答案基于以下假设:
g1
和g2
都是无环有向图(树)g2
中的子树替换为g1
g1
和g2
都是顶点和边不相交的,即g1
中的顶点(边)不出现在g2
中,反之亦然。JGraphT没有用于子树替换的内置方法,但是实现这样的方法会相当简单:
/**
* Replaces the subtree rooted in root2 in graph g2 with the subtree rooted in root1 in graph g1. Graph g1 is left
* unchanged.
* @param g1 first graph
* @param g2 second graph
* @param root1 root of subtree in first graph
* @param root2 root of subtree in second graph
* @param <V> vertex type
* @param <E> edge type
*/
public static <V,E> void replaceSubtree(Graph<V, E> g1, Graph<V, E> g2, V root1, V root2){
//1. Add subtree under root1 to graph g2 as a disconnected component
BreadthFirstIterator<V, E> bfs = new BreadthFirstIterator<>(g1,root1);
g2.addVertex(bfs.next());
while (bfs.hasNext()){
V vertex=bfs.next();
V parent=bfs.getParent(vertex);
g2.addVertex(vertex);
g2.addEdge(parent,vertex,bfs.getSpanningTreeEdge(vertex));
}
//2. Get the edge (object) between root2 and its parent. A special case occurs if root2 is also the root of g2
// in which case it does not have a parent.
E treeEdge = (g2.incomingEdgesOf(root2).isEmpty() ? null : g2.incomingEdgesOf(root2).iterator().next());
V parent= (treeEdge == null ? null : Graphs.getOppositeVertex(g2, treeEdge, root2));
//3. Remove subtree rooted in vertex k
bfs = new BreadthFirstIterator<>(g2,root2);
while(bfs.hasNext())
g2.removeVertex(bfs.next());
//4. Reconnect the two components
if(parent != null)
g2.addEdge(parent, root1, treeEdge);
}
下面是一些测试代码:
public static void main(String[] args){
Graph<String, DefaultEdge> g1 = new SimpleDirectedGraph<>(DefaultEdge.class);
Graphs.addAllVertices(g1, Arrays.asList("a", "b", "c", "d", "e", "f", "g"));
g1.addEdge("a", "b");
g1.addEdge("a", "c");
g1.addEdge("b", "d");
g1.addEdge("b", "e");
g1.addEdge("c", "f");
g1.addEdge("c", "g");
Graph<String, DefaultEdge> g2 = new SimpleDirectedGraph<>(DefaultEdge.class);
Graphs.addAllVertices(g2, Arrays.asList("i", "j", "k", "l", "m", "n", "o"));
g2.addEdge("i", "j");
g2.addEdge("i", "k");
g2.addEdge("j", "l");
g2.addEdge("j", "m");
g2.addEdge("k", "n");
g2.addEdge("k", "o");
replaceSubtree(g1, g2, "b", "k");
System.out.println(g2);
}
replaceSubtree(g1,g2,“b”,“k”);
给出:< code>([i,j,l,m,b,d,e],[(i,j),(j,l),(j,m),(b,d),(b,e),(I,b)]) < li>
replaceSubtree(g1,g2,“b”,“I”);
给出:< code>([b,d,e],[(b,d),(b,e)])
我想在有向(无环)图中找到最长的路径。假设我知道起始节点-汇。路径应该从这一点开始。我在想我可以将边的权重设置为-1。有很多方法可以找到所有最短的路径,但你必须通过终点。有没有可能得到最短的路径(无论最终节点如何)? 假设我想为节点 nr 1(汇)找到最长路径。所以这个算法给了我1-2-3-4-5-6。
问题内容: 我想用另一个子列表替换list中的一个子列表。像这样: 可以说我想要一个像这样的子列表: 并替换为 所以最终结果将是 有什么建议? 问题答案: 希望能有所帮助
我正在寻找一种更有效的方法来修剪用JGrapht构造的有向无环图(a DAG)。 DAG表示一组网络会话之间的时间关系。会话的父会话是在子会话开始之前完成的任何会话。构建DAG相对简单,但存在大量不必要的关系。为了提高效率,我希望对DAG进行修剪,以便每个子级与最小的父级数量有直接关系(或者相反,以便每个父级具有最小的直接子级数量)。 我现在使用的剪枝实现(如下所示)是基于在Streme中找到的代
在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。 因为有向图中一个点经过两种路线到达另一个点未必形成环,因此有向无环图未必能转化成树,但任何有向树均为有向无环图。 一、简介 有向无环图是图论的重要概念,我们将首先介绍图的概念和定义,随后介绍有向图,再逐渐引至有向无环图(DAG)。值得一提的是,当DAG用于指代模型时一般指向贝叶斯网络。 一个图G
问题内容: 我是Numpy的新手,想替换矩阵的一部分。例如,我有两个由numpy生成的矩阵A,B 最终,我想使A为以下矩阵。 和/或以下 我尝试跟随,但没有用。我现在不知道了:( 甚至我尝试过 检查四个单元是否更改。你有什么主意吗? 问题答案: 这是您可以执行的操作:
在一个已执行DFS的无向图中(为了生成一个DFS树,从而将每条边分类为树边或后边),图中是否存在仅由后边组成的循环,即没有树边?