算法 – 将DAG的大多数黑色顶点合并在一起,使其保持DAG?

我有一个DAG(有向无环图),顶点有黑色或白色两种颜色中的任何一种.我需要合并尽可能多的黑色顶点以及图形应该保持非循环的约束.因此,最终的DAG应该具有最小值.黑色顶点.这个问题的最佳算法是什么? 最佳答案 这是一种可能的策略.它可以将您的问题减少到着色问题(然后您可以使用文献中已建立的启发式算法来解决).

调用DAG G =(V,E),其中V是顶点集.设B是黑色顶点的集合,W是白色顶点的集合.我们想构造一个新的简单图G’=(B,E’).我们按如下方式构建它:

algorithm contruct G' input: G
Let G' be a graph with vertex set B and no edges
for any pair of vertices v and v' where v,v' in B:
    Let (G'', v'') = merge (v,v',G)
    #comment: here, we let G'' to be the graph resulted from merging v and v'
    #also, let's assume that v and v' merge to become v''
    if detect_cycle(G'',v'') = true:
        add edge (v,v') into G'
output G'

algorithm detect_cycle(G,v):
do BFS in G starting at v, with the modification when reaching any vertex v':
    if v is connected to v': return true
return false

请注意,G’是一个简单的图形而不是DAG,当在G上执行BFS时,您不能违背G中的边缘方向.
本质上,我们尝试用G中的一组黑色顶点构建G’,这样如果两个顶点v与G’中的v’相邻,那么合并它们会导致G中的循环图.如果v与G’中的v’不相邻那么合并它们是安全的.然后问题减少,找到顶点颜色G’所需的最小颜色数.有关顶点着色的背景,请查看此链接:https://en.wikipedia.org/wiki/Graph_coloring#Vertex_coloring.基本上,顶点着色是关于查找每组中最小数量的集合,您可以放入成对非相邻顶点,然后为每个集合分配标签(或颜色)(同一组中的每个顶点都获得相同的标签). G’中具有相同标签的每个黑色顶点都可以在G中合并.

可以在此处找到用于图着色的启发式算法:
http://heuristicswiki.wikispaces.com/Graph+coloring
在这里:http://heuristicswiki.wikispaces.com/Degree+based+ordering

我希望它有所帮助.如果您在上述解决方案中找到更好的解决方案或错误,请告诉我们.

点赞