圖的廣度遍歷算法和圖的深度遍歷算法
深度優先遍歷算法
1、深度優先遍歷的遞歸定義
假設給定圖G的初態是所有頂點均未曾訪問過。在G中任選一頂點v爲初始出發點(源點),則深度優先遍歷可定義如下:首先訪問出發點v,並將其標記爲已訪問過;然後依次從v出發搜索v的每個鄰接點w。若w未曾訪問過,則以w爲新的出發點繼續進行深度優先遍歷,直至圖中所有和源點v有路徑相通的頂點(亦稱爲從源點可達的頂點)均已被訪問爲止。若此時圖中仍有未訪問的頂點,則另選一個尚未訪問的頂點作爲新的源點重複上述過程,直至圖中所有頂點均已被訪問爲止。
圖的深度優先遍歷類似於樹的前序遍歷。採用的搜索方法的特點是儘可能先對縱深方向進行搜索。這種搜索方法稱爲深度優先搜索(Depth-First Search)。相應地,用此方法遍歷圖就很自然地稱之爲圖的深度優先遍歷
2.基本實現思想:
(1)訪問頂點v;
(2)從v的未被訪問的鄰接點中選取一個頂點w,從w出發進行深度優先遍歷;
(3)重複上述兩步,直至圖中所有和v有路徑相通的頂點都被訪問到。
3.代碼實現:
遞歸:
#include<iostream>
using namespace std;
#define N 10
int arr[N][N];
bool visited[N];
void init_graph()
{
for (int i = 1;i < N;++i)
for (int j = 1;j < N;++j)
cin >> arr[i][j];
}
void dfs_graph()
{
void dfs(int v);
memset(visited,false,sizeof(visited));
for (int i = 1;i < N;++i) //遍歷每個頂點是爲了防止圖不連通時無法訪問每個頂點
if (visited[i] == false)
dfs(i);
}
void dfs(int v) //深度遍歷頂點
{
int Adj(int x);
cout << v << " ";
visited[v] = true;
int adj = Adj(v);
while (adj != 0)
{
if(visited[v]==false)
dfs(adj); //遞歸調用是實現深度遍歷的關鍵所在
adj = Adj(v);
}
}
int Adj(int x) //求鄰接點 且未訪問的節點
{
for (int i = 1;i < N;++i)
if (arr[x][i] == 1 && visited[i] == false)
return i;
return 0;
}
int main()
{
cout << "請輸入矩陣:\n";
init_graph();
cout << "深度遍歷結果:" << endl;
dfs_graph();
system("pause");
return 0;
}