如何合并图表中的节点?

时间:2013-02-19 19:52:55

标签: graph graphviz graph-algorithm

我想在我的应用程序中合并语义相同的节点。我可以使用工具或算法来处理我的图表吗?

输入示例:节点 a b 应该合并。

digraph g {                                                                     
  a -> {b;c;d;e};                                                               
  b -> {a;c;d;e};                                                               
}

使用dot的图表图片:

nodes a and b should be merged

输出示例:节点 a b 已合并到节点 ab

digraph g {                                                                     
  ab -> {c;d;e};                                                                
}

enter image description here

粗略草图算法:

# XE = a set of nodes, represent a directed edge (x,_)
# YE = a set of nodes, representing a directed edge (y,_)
# XE \ y = XE except y
# YE \ x = YE except x

For each pair of nodes x,y
  If (edges (x,y) and (y,x) exists) AND (XE \ y == YE \ x)
    create new node xy -> xedges\y
    delete nodes x and y and their edges

2 个答案:

答案 0 :(得分:2)

有一个工具:它叫gvpr,代表图形模式扫描和处理语言

来自链接的pdf:

  

gvpr 是受 awk 启发的图表流编辑器。它将输入图复制到其输出,可能会改变它们的结构和   属性,创建新图表或打印任意信息。

我相信你可以通过创建一个gvpr程序来实现你所需要的。

我没有时间创建可行的解决方案,但您可以查看this answer以获取示例gvpr程序和其他信息。

答案 1 :(得分:1)

Graphviz中没有内置此功能,但您可以借助disjoint set data structure

预处理图表