1. 程式人生 > 其它 >初學演算法----深度優先搜尋

初學演算法----深度優先搜尋

深度優先搜尋大多可以看做在圖上遍歷和查詢;

圖的搜尋有兩種方式,一種是深度優先搜尋(Depth-First-Search),另一種是廣度優先搜尋(Breadth-First-Search);

深度優先搜尋(縮寫DFS)有點類似廣度優先搜尋,也是對一個連通圖進行遍歷的演算法。它的思想是從一個頂點V0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上一個節點,然後從另一條路開始走到底,這種儘量往深處走的概念即是深度優先的概念。

(1).深度優先搜尋的時間複雜度與空間複雜度大多取決於圖;

圖的表示方法:翁愷老師講了:

1.二維陣列矩形表: 用二維陣列G[i][j]存放圖,G[i][j]能夠表示i與j邊界的情況(是否能通,其中的權,方向等)

2.鄰接表:每一個節點用一個一維陣列表示邊界情況;

具體情況還是我學了資料結構再來吧;

(2)深度優先搜尋的幾種情況:

1.是否能夠找到正確路徑:

虛擬碼如下:

#include <iostream>
#include <cstdio>
using namespace std;
//判斷是否能找到正確路徑;
//函式的功能是判斷是否能在現在的點上一直遍歷找到路徑
bool DFS (nowpoint)
{
if (nowpoint==終點)
{
return true;
}
if (nowpoint==舊點)
{
return false;
}
將nowpoint標記為舊點;
然後對nowpoint旁邊的點進行遍歷判斷{
if (DFS (sidepoint))
{
return true;
}

}
如果對所有的旁邊的點都進行了判斷還沒成功,
則退回到上一個點;
return false;
}
int main()
{
將所有點標記為未使用的點;
設定起點;
設定終點;
cout<<DFS (起點);
return 0;
}

2.輸出正確路徑:

虛擬碼如下:

#include <iostream>
#include <cstdio>
using namespace std;
int(陣列的型別不唯一,具體看題目) array[10000];
int depth;
//函式的功能是判斷是否能在現在的點上一直遍歷找到路徑,並記錄路徑;
bool DFS (nowpoint)
{
if (nowpoint==終點)
{
array[depth]==終點;
return true;
}
if (nowpoint==舊點)
{
return false;
}
標記nowpoint為舊點;
array[depth]=nowpoint;
depth++;
去讓遍歷nowpoint旁邊其他點 {
if (DFS (sidepoint))
{
return true;
}

}
如果均無答案,則回退,彈出記錄的點;
depth--;
return false;
}
int main()
{
//回退是沒有代價的;
depth=0;
if ( DFS (起點) )
{
for (int i=0;i<=depth;i++)
{
printf ("%d",array[i]);
if (i!=depth)
{
printf ("->");
}
}
printf ("\n");
}
return 0;
}

當然這隻能輸出一條正確路徑;

3.遍歷圖上全部點:'

虛擬碼如下:

#include <iostream>
#include <cstdio>
using namespace std;
//遍歷圖上的每一個點;
void DFS (nowpoint)
{
if (nowpoint==舊點)
{
return ;
}
標記nowpoint為舊點;
對旁邊的點進行遍歷{
DFS (sidepoint);
}
若無其他點,則回退;
return ;
}
int main()
{
將所有點標記為新點;
while (能夠在圖上找到新點)
{
DFS (新點);
}
return 0;