深度優先搜索就是有多遠就走多遠,能滾到哪就滾到哪
這個思想是從頭訪問一個點,輸出這個點,然後把這個點標記爲已讀,找到與他相連的任意一個點,再次進行此操作,遞歸
挺好理解的哈
給個例子:
僞代碼:
int flag = 0; // 這個就是標記量,標記有多少個已經走過了,如果這個flag == 總共的點數,那麼就代表程序輸出結束了
對象 point //每個點是一個對象,屬性有連接的點的數組,一個int a變量標記是否已經走過, 0代表沒走過,1代表走過
先來一個遞歸的,直接寫的,不確定對不對啊,大體思路絕對沒問題的,反正也是僞代碼啊
deep (point p)
{
if(flag == 總共的點數)
{
//ok了,可以退出函數了
}
if(p.a == 0)
{
System.out.print(p);
p.a = 1;
flag ++;
deep(一個連接他的點);
}
else
{
deep(返回上一個點);
}
}
//這個程序在if的deep遞歸的時候中還需要一個操作,不能每次都遞歸那個連接點數組中的第一個,你每次都deep第一個那後面的能願意嗎?是吧,這個怎麼做沒寫,因爲有很多種方法,比如,每次先取出第一個,然後在數組中刪除等
//還有一個就是怎麼找到上一個點,這個隨便寫,也不說了
再寫一個循環的
while (true)
{
if(flag == 總共的點數)
{
break;
}
if(p.a == 0)
{
System.out.print(p);
flag++;
p.a = 下一個連接的點 ;
}
else
{
p.a = 上一個點;
}
}
這個跟遞歸差不多,當然問題也差不多。。。
void DFS(ALGraph G, int v){ //圖G爲鄰接表類型
cout<<v; visited[v] = true; //訪問第v個頂點
p= G.vertices[v].firstarc; //p指向v的邊鏈表的第一個邊結點
while(p!=NULL){ //邊結點非空
w=p->adjvex; //表示w是v的鄰接點
if(!visited[w]) DFS(G,w); //如果w未訪問,則遞歸調用DFS
p=p->nextarc; //p指向下一個邊結點
}
}