[英]Depth First Search Using Adjacency Matrix
誰能解釋使用鄰接矩陣進行深度優先搜索的算法? 我知道使用遞歸的深度優先搜索的算法,我嘗試使用Adjacency矩陣實現它,但它不是很成功。
到目前為止我所擁有的是什么
dfs(G,i){
mark i as visited;
for(traverse through the edges of i vertex){
if(vertex of edge is unseen){
DFS(G,newVerted)
}
}
}
void DFS(int i)
{
int j;
printf("\n%d",i);
visited[i]=1;
for(j=0;j<n;j++)
if(!visited[j]&&G[i][j]==1)
DFS(j);
}
其中n
是頂點的否, G
是圖形, G[i][j]
表示頂點i
連接到頂點j
您錯過了在函數dfs(G,i)
打印
代碼如下
dfs(G,i){
int j;
printf("%d ",i);
visited[i]=1;
for(j=0;j<n;j++){
if(visited[j]==0&&G[i][j]==1)
dfs(G,j);
}
這里我們使用變量n作為Graph中的頂點數.G是成本鄰接矩陣。
我認為這是最簡單的,就像在迷宮中你總是離開。 如果你來自n節點,則按周期順序進入下一個節點。
我只是不知道你怎么知道你到處走走:D但很酷的是你不需要額外的空間和標記。
編輯
例
5
/ \
7 3
/\ /\
4 1 6 2
我是
......1
..1....
.1..11.
1.....1
..1...1
..1....
1..11..
所以從5開始的訂購是3 6 3 2 3 5 7 1 7 4 7 5 3#並且因為你從5-> 3開始
正如我所說,如果你在節點上,你可以根據你來自的節點繼續下一個節點。 您要訪問的下一個節點是來自主流節點的下一個號碼(不是您當前的節點)。
我猜你可以通過維護堆棧和訪問列表,並使用while循環來實現:訪問是一個bool [],初始化為在所有位置保持false,我假設調用G [node,neighbor]以某種方式返回一個布爾值,告訴我是否存在從節點到鄰居的邊緣。 (與1的隱式比較或簡單地使鄰接矩陣保持布爾值)
Stack保存節點的索引:
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)
}
我確信它可以被優化(並且看到我已經厭倦了,可能會有一些邏輯錯誤),但如果基本程序有意義,那就是一個開始!
編輯:澄清,並添加此提示:遞歸可能更容易;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.