3

我有兴趣使用 jgrapht 提供的各种类型的有向和无向图类编写图着色算法。他们似乎都没有在图类本身(例如 DirectedSimpleGraph)中轻松做到这一点的能力。

我的目标是能够遍历图形对象,并向顶点添加/更改各种标签或颜色,而无需将顶点信息存储在对象本身之外 - 即我想使用或创建诸如“DirectedSimpleGraph”之类的方法.setColorToVertex(v, c),其中 v 是一个顶点。c 是可能被定义为整数的颜色。任何线索或最佳实践建议将不胜感激。

4

3 回答 3

2

能够为顶点着色或标记的典型方法是将您自己的 Vertex 类提供给存储您需要的任何内容的 jgrapht。例如,

public class MyVertex {
  public String colour;
}

SimpleGraph<MyVertex, DefaultEdge> g = 
    new SimpleGraph<MyVertex,DefaultEdge>(DefaultEdge.class);
MyVertex v1 = new MyVertex();
MyVertex v2 = new MyVertex();

g.addVertex(v1);
g.addVertex(v2);

DefaultEdge edge = g.addEdge(v1, v2);

//traverse graph
Graphs.getOppositeVertex(g, edge, v1).colour = "red";

这样,您不需要使用外部机制(例如哈希映射)来跟踪顶点颜色/标签。

于 2015-10-14T04:19:33.570 回答
0

看起来 jgrapht 库https://github.com/jgrapht/jgrapht 正在积极开发中。也许你可以联系开发商?查看 github 链接上的自述文件以获取更多信息。

您可以扩展库中的抽象类以添加您想要的自定义字段和功能。

于 2015-08-06T19:14:59.787 回答
0

我想使用或创建诸如“DirectedSimpleGraph.setColorToVertex(v, c) 之类的方法,其中 v 是一个顶点

图作为数据结构没有颜色的概念。只有图形的视觉表示可以。

因此,您可以使用类似的东西DOTExporter以各种方式更改图形,包括为边和顶点着色:

public void printGraph(Graph<GraphNode, DefaultEdge> graph) {
    PrintWriter writer = new PrintWriter(System.out);
    DOTExporter exp = new DOTExporter<>(
            new NodeIdProvider(),
            new NodeLabelProvider(),
            new StringEdgeNameProvider<DefaultEdge>(),
            new NodeAttributeProvider(),
            new EdgeAttributeProvider());
    exp.exportGraph(graph, writer);
}

NodeAttributeProvider打印每个节点:

public class NodeAttributeProvider implements ComponentAttributeProvider<GraphNode>
{
    @Override
    public Map<String, String> getComponentAttributes(GraphNode component) {
        Map<String, String> attrs = new HashMap<>();
        attrs.put("style", "filled");
        attrs.put("fillcolor", component.getFillColor());
        return attrs;
    }
}

你的工作就是实现接口GraphNode及其方法getFillColor()

于 2020-02-24T23:23:04.640 回答