我想你可以通過維護堆棧和訪問列表,並使用while循環: 訪問是一個bool [],初始化爲在所有位置保持false,並且我假設調用G [node,neighbor]以某種方式返回一個布爾值,告訴節點是否存在從邊到邊的邊。 (隱比較1或簡單地使鄰接矩陣保持布爾)
堆棧握着你的節點的索引:
dfs(G,i){
Initialize Stack
Current = i
PossibleEdge = 0
Visited[Current] = true //You have visited the starting node
Do {
While (PossibleEdge < count) {
if (G[Current,PossibleEdge] && NOT Visited[PossibleEdge]){
Stack.Push(Current) //Save state
Current = PossibleEdge //Continue with the child node
Visited[Current] = true
PossibleEdge = -1 //So that it will be incremented to 0
}
PossibleEdge++
}
PossibleEdge = Current //Continue to next row of "parent node"
Current = Stack.Pop() //Get parent node back
} While (Stack contains nodes)
}
我敢肯定,它可以優化(而當看到我累得要死,有可能是一些邏輯錯誤),但如果基本過程有意義,那就是一個開始!
編輯:澄清,並添加這個提示:遞歸是可能更容易;)
什麼錯?理論上你的僞代碼看起來很好(除了BFS部分:)。如果您可以使用鄰接列表來執行DFS,那麼使用矩陣進行操作應該只是循環遍歷該矩陣的行並查看位的設置位置以及未訪問的頂點 – dfb 2012-08-03 22:04:47
您是否瞭解深度優先搜索是?你知道一個鄰接矩陣是什麼嗎? – 2012-08-03 22:10:15