微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 SpanningTree<DefaultEdge> 创建 SimpleWeightedGraph<Node, DefaultEdge>

如何解决如何从 SpanningTree<DefaultEdge> 创建 SimpleWeightedGraph<Node, DefaultEdge>

我使用了 KruskalMinimumSpanningTree,所以我可以使用 getSpanningTree() 方法。 该方法返回一个仅包含边(没有更多节点)的 SpanningTree。对于我的导出功能,我需要一个图表... 有没有办法得到一个只包含集合中边的图?

SimpleWeightedGraph<Node,DefaultEdge> myGraph = createGraph(List<Node> myList);
    KruskalMinimumSpanningTree<Node,DefaultEdge> myKTree = new KruskalMinimumSpanningTree<Node,DefaultEdge>(myGraph);
    SpanningTree<DefaultEdge> mySTree = myKTree.getSpanningTree();

我的导出功能

public static void export(SimpleWeightedGraph<Node,DefaultEdge> graph){
    
    DOTExporter<Node,DefaultEdge> exporter =
        new DOTExporter<>(v -> v.address.replaceAll("[ -./äöüß]","_"));

    Writer writer = new StringWriter();
    exporter.exportGraph(graph,writer);
    System.out.println(writer.toString());
}

解决方法

当然,假设您的生成树跨越所有顶点,您可以简单地创建一个子图:

Graph<Node,DefaultEdge> spanningTreeGraph=new AsSubgraph(myGraph,myGraph.vertexSet(),mySTree.getEdges());

如果您的树没有跨越整个图,您首先必须收集与树边相关的顶点:

Set<Node> vertexSubset=new HashSet<>();
for(DefaultEdge edge : mySTree.getEdges()){
  vertexSubset.add(myGraph.getEdgeSource(edge));
  vertexSubset.add(myGraph.getEdgeTarget(edge));
}
Graph<Node,vertexSubset,mySTree.getEdges());

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。