我有兴趣使用 jgrapht 提供的各种类型的有向和无向图类编写图着色算法。他们似乎都没有在图类本身(例如 DirectedSimpleGraph)中轻松做到这一点的能力。
我的目标是能够遍历图形对象,并向顶点添加/更改各种标签或颜色,而无需将顶点信息存储在对象本身之外 - 即我想使用或创建诸如“DirectedSimpleGraph”之类的方法.setColorToVertex(v, c),其中 v 是一个顶点。c 是可能被定义为整数的颜色。任何线索或最佳实践建议将不胜感激。
我有兴趣使用 jgrapht 提供的各种类型的有向和无向图类编写图着色算法。他们似乎都没有在图类本身(例如 DirectedSimpleGraph)中轻松做到这一点的能力。
我的目标是能够遍历图形对象,并向顶点添加/更改各种标签或颜色,而无需将顶点信息存储在对象本身之外 - 即我想使用或创建诸如“DirectedSimpleGraph”之类的方法.setColorToVertex(v, c),其中 v 是一个顶点。c 是可能被定义为整数的颜色。任何线索或最佳实践建议将不胜感激。
能够为顶点着色或标记的典型方法是将您自己的 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";
这样,您不需要使用外部机制(例如哈希映射)来跟踪顶点颜色/标签。
看起来 jgrapht 库https://github.com/jgrapht/jgrapht 正在积极开发中。也许你可以联系开发商?查看 github 链接上的自述文件以获取更多信息。
您可以扩展库中的抽象类以添加您想要的自定义字段和功能。
我想使用或创建诸如“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()
。