我正在寻找一种方法来执行一个给定的有向非加权图上的拓扑排序,其中包含循环。结果不仅要包含顶点的排序,还要包含被给定排序所违背的边集。这组边应是最小的。
由于我的输入图可能很大,我不能使用指数时间算法。如果不可能在多项式时间内计算出最优解,那么对于给定的问题,什么启发式是合理的?
Eades,Lin和Smyth为反馈弧集问题提出了一个快速有效的启发式。最初的文章是在付费墙后面,但免费副本可以从这里获得。
有一种拓扑排序算法,它通过选择一个没有进入弧的顶点,在图中递归减该顶点,并将该顶点提前到该顺序来建立顶点顺序。(我是递归地描述算法,但您不必以这种方式实现它。)Eades-Lin-Smyth算法也寻找没有输出弧的顶点并追加它们。当然,所有顶点都有传入和传出的弧是可能发生的。在这种情况下,选择传入和传出之间微分最高的顶点。这里无疑有实验的空间。
具有可证明最坏情况行为的算法是基于线性规划和图割的。这些都很简洁,但保证不够理想(log^2 n或log n log log n倍于所需的弧),我怀疑高效的实现将是一个相当大的项目。
如何输出有向无环图的所有可能的拓扑排序?例如,给定一个图形,其中 V 指向 W 和 X,W 指向 Y 和 Z,X 指向 Z: 如何对此图进行拓扑排序以产生所有可能的结果?我能够使用广度优先搜索来获得V,W,X,Y,Z,并使用深度优先搜索来获得V,W,Y,Z,X。但无法输出任何其他种类。
解决这个问题的正确方法是什么?还能在线性时间内求解吗?
PS:或者,有可能把这个问题表述为线性整数优化问题吗?
是否有一种算法,在给定一个未加权有向无环图的情况下,将所有节点排序到一组节点列表中,从而 保留拓扑顺序(即,对于所有边
Wikipedia以一种非常直观的方式(IMO)解释了依赖关系图,引用了当依赖于时,会产生边。换句话说,我们可以通过查看其邻接列表中可用的邻居立即找到任何给定节点的直接依赖关系(如果有的话)。 这似乎是实现依赖的一个明智的方法;它允许我们基本上像执行深度优先遍历(图中每个节点的DFS)一样容易地执行拓扑排序。如果节点表示“任务”,那么只有当任务的所有传递依赖项都已执行/访问时,我们才能执行/访问任
今天我遇到了这个奇怪的控制台错误在铬和Safari: 拒绝在框架中显示...,因为祖先违反了以下内容安全策略指令:“框架-祖先*”。 怎么可能违反*?是语法错了吗?