圖的遍歷:深度優先搜尋與廣度優先搜尋
1、定義
- 深度優先搜尋(DFS):從圖中某個初始頂點v出發,首先訪問初始頂點v,然後選擇一個與頂點v相鄰且沒被訪問過的頂點w為初始頂點,再從w出發進行深度優先遍歷,直到圖中與當前頂點v鄰接的所有頂點都被訪問過為止。
- 廣度優先搜尋(BFS):首先訪問初始頂點v,接著訪問頂點v的所有未被訪問過的鄰接點v1,v2,...,vt,然後再按照v1,v2,...,vt的次序,訪問每一個頂點的所有未被訪問過的鄰接點,依次類推,直到圖中所有和初始頂點v有路徑相通的頂點都被訪問過為止。
2、應用
- 深度優先搜尋主要用於圖的查詢。
- 廣度優先搜尋主要用於求圖中兩個頂點的最短路徑。
3、實現
(1)鄰接矩陣圖的型別定義
#define N 100
typedef char ElemType;
//adjacency matrix graph
typedef struct MGraph
{
ElemType vertexes[N];
int edges[N][N];
int visited[N];
int n;
}MGraph;
(2)深度優先搜尋演算法(DFS)
//deep-first search
void DFS(MGraph &g, int k)
{
cout << g.vertexes[k];
g.visited[k] = 1;
for (int i = 0; i < g.n; i++)
{
if (g.visited[i] == 0 && g.edges[k][i] != 0)
{
DFS(g, i);
}
}
}
(3)廣度優先搜尋演算法(BFS)
//breadth-first search
void BFS(MGraph g, int k)
{
queue<int> q;
q.push(k);
g.visited[k] = 1;
while (!q.empty())
{
k = q.front();
cout << g.vertexes[k];
q.pop();
for (int i = 0; i < g.n; i++)
{
if (g.visited[i] == 0 && g.edges[k][i] != 0)
{
q.push(i);
g.visited[i] = 1;
}
}
}
}
4、測試
樣例輸入:
5 HUEAK 0 0 2 3 0 0 0 0 7 4 2 0 0 0 0 3 7 0 0 1 0 4 0 1 0
預期輸出:
HUEAK HUEAK
#include <iostream>
#include <queue>
using namespace std;
#define N 100
typedef char ElemType;
//adjacency matrix graph
typedef struct MGraph
{
ElemType vertexes[N];
int edges[N][N];
int visited[N];
int n;
}MGraph;
//deep-first search
void DFS(MGraph &g, int k)
{
cout << g.vertexes[k];
g.visited[k] = 1;
for (int i = 0; i < g.n; i++)
{
if (g.visited[i] == 0 && g.edges[k][i] != 0)
{
DFS(g, i);
}
}
}
//breadth-first search
void BFS(MGraph g, int k)
{
queue<int> q;
q.push(k);
g.visited[k] = 1;
while (!q.empty())
{
k = q.front();
cout << g.vertexes[k];
q.pop();
for (int i = 0; i < g.n; i++)
{
if (g.visited[i] == 0 && g.edges[k][i] != 0)
{
q.push(i);
g.visited[i] = 1;
}
}
}
}
int main()
{
int n;
while (cin >> n)
{
//init
MGraph g;
g.n = n;
//input
for (int i = 0; i < n; i++)
cin >> g.vertexes[i];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> g.edges[i][j];
//print
memset(g.visited, 0, n * sizeof(int));
DFS(g, 0); cout << endl;
memset(g.visited, 0, n * sizeof(int));
BFS(g, 0); cout << endl;
}
return 0;
}
參考文獻
[1] 李春葆.資料結構教程.清華大學出版社,2013.
相關文章
- 圖的廣度優先搜尋和深度優先搜尋Python實現Python
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- 基本演算法——深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法
- ybtoj:廣度優先搜尋
- bfs廣度優先搜尋
- 深度優先搜尋
- c++ 廣度優先搜尋(寬搜)C++
- 深度和廣度優先搜尋演算法演算法
- ybtoj:深度優先搜尋
- DFS(深度優先搜尋)
- js版本的(廣、深)度優先搜尋JS
- 啟發式搜尋的方式(深度優先,廣度優先)和 搜尋方法(Dijkstra‘s演算法,代價一致搜尋,貪心搜尋 ,A星搜尋)演算法
- 再來一篇深度優先遍歷/搜尋總結?
- js實現深度優先遍歷和廣度優先遍歷JS
- dfs深度優先搜尋解決迷宮類問題(遍歷)
- 【程式碼隨想錄】廣度優先搜尋
- 演算法筆記(廣度優先搜尋)演算法筆記
- 【演算法】廣度/寬度優先搜尋(BFS)演算法
- 二分搜尋樹系列之[ 深度優先-層序遍歷 (ergodic) ]Go
- 二分搜尋樹系列之「深度優先-層序遍歷 (ergodic) 」Go
- leetcode 刷題之深度優先搜尋LeetCode
- 【演算法】深度優先搜尋(DFS)演算法
- 深度優先遍歷,廣度優先遍歷實現物件的深拷貝物件
- 廣度優先遍歷圖解圖解
- 演算法競賽——BFS廣度優先搜尋演算法
- 「Golang成長之路」迷宮的廣度優先搜尋Golang
- 演算法(三):圖解廣度優先搜尋演算法演算法圖解
- 深度優先與廣度優先
- 廣度優先搜尋(BFS)思路及演算法分析演算法
- golang學習筆記——迷宮的廣度優先搜尋Golang筆記
- 深度優先搜尋演算法(DFS)講解演算法
- 深度優先搜尋演算法-dfs講解演算法
- 【知識點】深度優先搜尋 Depth First Search
- 深度優先搜尋 (Depth First Search 簡稱:DFS)
- 從1到n的全排列(深度優先搜尋)
- POJ1915,雙向寬度優先搜尋
- 0基礎學演算法 搜尋篇第一講 深度優先搜尋演算法
- 深度優先搜尋(DFS)思路及演算法分析演算法