我有一个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。
然而,从a到c的有向边是多余的,因为a已经有一个指向b的有向边,而b又有一个指向c的有向边。我该如何修剪所有这些多余的边?我考虑使用最小生成树算法,但我不确定在这种情况下应该应用哪个算法。
我想我可以从每个节点和它的所有出边开始进行深度优先搜索,并比较是否可以到达某些节点而不使用某些边,但这似乎效率非常低下。
算法完成后,输出将是一条线性列表,其中包含与图一致的顺序中的所有节点。因此,如果a有三个指向b、c和d的有向边。b和c也各有一个指向d的有向边,输出可以是abcd或acbd。