圖的深度遍歷和廣度遍歷算法

圖的廣度遍歷算法和圖的深度遍歷算法

深度優先遍歷算法

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;
}

發佈了68 篇原創文章 · 獲贊 216 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章