簡體   English   中英

計算一組節點到根節點形成的子樹

[英]Calculate the subtree formed from a group of nodes to the root node

我有一個有向無環圖,我希望傳入一組節點以從根節點獲取子樹給它們。

比如下圖中,如果傳入了D和E,應該返回一個由A、B、D、E組成的子樹(圖)

        A
      /  \
    B     C
   / \
  D   E
 /
G  

您需要確定要包含在子圖中的頂點。 您可以通過從您選擇的底部頂點返回到根節點來執行此操作。

//Create graph
Graph<String, DefaultEdge> dag = new SimpleDirectedGraph<>(DefaultEdge.class);
Graphs.addAllVertices(dag, Arrays.asList("A","B","C","D","E","G"));
dag.addEdge("A","B");
dag.addEdge("A","C");
dag.addEdge("B","D");
dag.addEdge("B","E");
dag.addEdge("D","G");
NeighborCache<String, DefaultEdge> neighborCache = new NeighborCache<>(dag);

//Define inputs
Set<String> blockers = Set.of("D", "E");

//Figure out which vertices are in the subgraph
Queue<String> queue=new LinkedList<>();
queue.addAll(blockers);
Set<String> subgraphVertices = new HashSet<>();
while(!queue.isEmpty()){
    String vertex = queue.poll();
    subgraphVertices.add(vertex);
    queue.addAll(neighborCache.predecessorsOf(vertex));
}

//Create subgraph
Graph<String,DefaultEdge> subDag = new AsSubgraph<>(dag, subgraphVertices);
System.out.println(subDag);

如果需要,您可以在上述代碼中包含一些性能改進,因為某些頂點會多次添加到隊列中。 舉個例子,當你從頂點 D 走到根節點 A 時,你會遇到頂點 B。同樣,當你從 E 走回來時,你又會遇到 B。 沒有必要重新訪問B。

https://github.com/jgrapht/jgrapht/issues/1121我在這里問了同樣的問題並找到了解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM