1
處僅在於從DFS不同,僅在當前元素的該處理從DFS不同拓撲排序是遞歸調用
- 在Toplogical排序的情況下的拓撲排序,處理(添加到輸出後進行 堆棧)當前元素在遞歸調用後完成,而
- 在DFS的情況下,在遞歸調用之前處理當前元素(即打印或 添加到輸出隊列)?
這是我的DFS
public void depthfirstsearchrecursive()
{
for(int i = 0;i<vertices.size();i++)
{
if(vertices.get(i).isVisited == false)
{
vertices.get(i).isVisited = true;
System.out.println(vertices.get(i).name + " ");
depthfirstsearchrecursiveUtil(vertices.get(i));
}
}
}
public void depthfirstsearchrecursiveUtil(Vertex v)
{
for(int i = 0;i<v.neighbors.size();i++)
{
if(v.neighbors.get(i).isVisited == false)
{
v.neighbors.get(i).isVisited = true;
System.out.println(v.neighbors.get(i).name + " ");
depthfirstsearchrecursiveUtil(v.neighbors.get(i));
}
}
}
代碼正如你所看到的,我首先打印件,然後,進行遞歸調用。
這是我的拓撲排序實現
/* topological sort recursive */
public void topologicalsortrecursive()
{
Stack<Vertex> output = new Stack<Vertex>();
for(int i = 0;i<vertices.size();i++)
{
if(vertices.get(i).isVisited == false)
{
vertices.get(i).isVisited = true;
topologicalsortrecursiveDriver(vertices.get(i), output);
// System.out.println(vertices.get(i).name + " ");
output.push(vertices.get(i));
}
}
}
public void topologicalsortrecursiveDriver(Vertex v, Stack<Vertex> output)
{
for(int i = 0;i<v.neighbors.size();i++)
{
if(v.neighbors.get(i).isVisited == false)
{
v.neighbors.get(i).isVisited = true;
topologicalsortrecursiveDriver(v.neighbors.get(i), output);
// System.out.println(v.neighbors.get(i).name + " ");
output.push(v.neighbors.get(i));
}
}
}
這裏,處理(推入堆棧,遞歸調用作出後完成)
難道說,
- DFS就像是PreOrder遍歷,我們在那裏處理元素,然後 去找它的孩子,而
- 拓撲排序就像是一個相反的帖子序遍歷,我們去哪裏 孩子,然後再處理當前的元素,通過推動 他們堆棧,(這就是爲什麼我說反向後序)