我目前正在为大学工作,我必须得到有向图的拓扑排序(如果它是DAG)(没有循环,没有多边)或获得强大的组件(如果它不是DAG)。 Tarjans算法似乎是最好的,因为它以颠倒的拓扑顺序找到图的所有强组件。如果图是DAG,它会找到所有顶点的反向拓扑排序,因为DAG中的每个顶点都是它自己的SCC。问题是拓扑种类的tarjans alg。在DAG上并不总是适合标准顶部。排序(问题末尾的那个)发现,这让我大学给出的所有测试都失败了。
这个例子就是这个DAG有8个顶点和下面的边 在这个例子中的立场。最佳。排序alg。不会创造相同的顶部。排序为tarjan alg。
0 - > 4
1 - > 6
2 - > 1
3 - > 1
5 - > 6
6 - > 4
7 - > 3
问题是,是否有可能始终将拓扑排序标准放在首位。 sort从修改后的tarjan返回以及修改的外观。 Tarjans O(v + e)不应该通过修改来改变。
我知道我可以实现两者,但是挑战是关于性能的,所以我宁愿让一个算法同时执行这两个。
我目前正在维基百科上使用tarjans实现 https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
这是立场。用于我大学测试的顶级排序算法List L
foreach v ∈ V
count[v] ← 0
foreach v ∈ V
foreach Kante (v, w) ∈ E
count[w] ← count[w]+1
foreach v ∈ V
if count[v] = 0
Add v at beginning of L
while L is not empty
v ← first element in L
delete v from L
print v(or assign v and incrementing index)
foreach Kante (v, w) ∈ E
count[w] ← count[w]−1
if count[w] = 0
add w at the beginning of L
此算法始终从Vertex 0开始。 在寻找adj。顶点总是最低的调整。顶点(作为数字)首先。 F.E.它将是0 - > 1然后0-> 6
我希望你能帮助我,并提前感谢你。