我有一个表示属性列表的DAG。这些属性是这样的:如果a> b,则a具有b的有向边。它也是传递性的,因此如果a> b和b> c,则a具有到c的有向边。
然而,从a到c的有向边是多余的,因为a具有到b的有向边,而b具有到c的有向边。我怎样才能修剪所有这些多余的边缘?我在考虑使用最小生成树算法,但我不确定在这种情况下适用的算法是什么
我想我可以从每个节点及其所有传出边缘进行深度优先搜索,并比较它是否可以在不使用某些边缘的情况下到达某些节点,但这看起来非常低效且速度慢。
算法完成后,输出将是与图形一致的所有节点的线性列表。因此,如果a有b,c和d三个有向边。 b和c也都有一个有向边到d,输出可以是abcd或acbd。
答案 0 :(得分:6)
这称为transitive reduction problem。从形式上讲,您正在寻找一个最小(最少边)有向图,其传递闭包等于输入图的传递闭包。 (上面的维基百科链接上的图表清楚说明了。)
显然存在一种解决这个问题的有效算法,它需要与生成传递闭包相同的时间(即添加传递链接而不是删除它们的更常见的反问题),但是Aho的link to the 1972 paper ,Garey和Ullman下载费用为25美元,而且一些快速的谷歌搜索没有出现任何好的描述。
编辑:Scott Cotton's graphlib
包含Java implementation!这个Java库看起来组织得很好。
答案 1 :(得分:2)
实际上,在环顾四周之后,我认为Topologicalsort是我真正追求的。
答案 2 :(得分:0)
如果这些已经是具有有向边的n个节点:
实际上它只是一种排序算法,完全复杂度应为o(0.5n ^ 2)。
一个问题是,如果我们想要循环一个节点的父节点,那么我们需要更多的内存来记录边缘,这样我们就可以从子节点追溯到父节点。这可以在步骤3中进行改进,我们从大于M的左侧节点中选择一个节点,这意味着我们需要保留节点列表以了解剩下哪些节点..