我在绘制一个与此无关的图形时遇到了以下算法问题:
我们有一个平面双分图的图形,其中不相交的集合按列排列如图所示。 如何重新排列每列中的节点,以使边交错的数量最小化? 我知道这个问题对于一般图是NP难题(链接),但考虑到图是双分图,是否有一些技巧可用?
作为后续,如果有第三列w,它只连接到v怎么办?或者更进一步呢?
我在绘制一个与此无关的图形时遇到了以下算法问题:
我们有一个平面双分图的图形,其中不相交的集合按列排列如图所示。 如何重新排列每列中的节点,以使边交错的数量最小化? 我知道这个问题对于一般图是NP难题(链接),但考虑到图是双分图,是否有一些技巧可用?
作为后续,如果有第三列w,它只连接到v怎么办?或者更进一步呢?
Peter de Rivaz指出这个问题是NP-Hard的,但如果你可以接受一些近似解,可以采用以下方法。
我最初的想法是使用一些基于力的算法来进行图形布局,但实现起来可能有些繁琐。但是,嘿,有这个神奇的程序graphviz.org,它可以为您完成整个工作。
因此,在安装后,只需要准备一个包含您的图形的文件:
graph G{
{rank=same A B C D E}
{rank=same F G H K I J}
A -- F;
A -- G;
A -- K;
A -- I;
A -- H;
A -- J;
B -- G;
C -- G;
C -- J;
D -- K;
D -- I;
}
运行命令: dot -Tpng yourgraph -o yourgraph.png
然后你就可以免费获得类似下面的图片了 :-):