DFS和BFS学习笔记
DFS(深度优先遍历)
图中蓝色的是顶点之间的边。
从某一个顶点v开始,遍历与其相邻的顶点w0,w1,...,wn,在访问w1之前,先访问w0,并且遍历完w0的所有相邻顶点。DFS是一个递归的过程,有前进和回退。
C++代码实现:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <vector> 2 #include <stdio.h> 3 #include <cstdlib> 4 #include <queue> 5 #include <string.h> 6 using namespace std; 7 #define N 100 8 9 char vertex[N]; 10 // vector在这相当于邻接表的用法! 11 vector<int> a[N]; 12 bool vis[N]; 13 int n,e; 14 15 void recursive_dfs(int v) { 16 vis[v] = true; 17 printf("%c ", vertex[v]); 18 vector<int>::iterator it; 19 for (it = a[v].begin(); it != a[v].end(); it++) { 20 if (!vis[ *it ]) 21 recursive_dfs(*it); 22 } 23 24 } 25 26 void dfs() { 27 // 对每一个顶点都进行DFS,防止图存在不连通的区域而没有遍历到 28 for (int i = 0; i < n; i++) { 29 if (!vis[i]) 30 recursive_dfs(i); 31 } 32 } 33 34 int main() 35 { 36 int k, j; 37 for (int i = 0; i < 10; i++) { 38 vertex[i] = 'A' + i; 39 } 40 printf("输入顶点数和边数:"); 41 scanf("%d%d", &n, &e); 42 printf("输入边信息<e1,e2>:\n"); 43 for (int i = 0; i < e; i++) { 44 scanf("%d%d", &k, &j); 45 a[k].push_back(j); 46 } 47 dfs(); 48 return 0; 49 }
BFS(广度优先遍历)
广度优先算法有个特点,是按层次向下推进的,比如上图,遍历起点是A,接着遍历的A的所有相邻顶点(B,C,D),接着是B,C,D的相邻顶点。
C++代码实现:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <vector> 2 #include <stdio.h> 3 #include <cstdlib> 4 #include <queue> 5 #include <string.h> 6 using namespace std; 7 #define N 100 8 9 char vertex[N]; 10 // vector在这相当于邻接表的用法! 11 vector<int> a[N]; 12 bool vis[N]; 13 int n,e; 14 void bfs() { 15 queue<int> q; 16 int v; 17 for (int i = 0; i < n; i++) { 18 if (!vis[i]) { 19 q.push(i); 20 while (!q.empty()) { 21 v = q.front(); 22 if (!vis[v]) { 23 vis[v] = true; 24 printf("%c ", vertex[v]); 25 for (int j = 0, size = a[v].size(); j < size; j++) { 26 if (!vis[ a[v][j] ]) 27 q.push(a[v][j]); 28 } 29 } 30 q.pop(); 31 } 32 } 33 } 34 } 35 36 int main() 37 { 38 int k, j; 39 for (int i = 0; i < 10; i++) { 40 vertex[i] = 'A' + i; 41 } 42 printf("输入顶点数和边数:"); 43 scanf("%d%d", &n, &e); 44 printf("输入边信息<e1,e2>:\n"); 45 for (int i = 0; i < e; i++) { 46 scanf("%d%d", &k, &j); 47 a[k].push_back(j); 48 } 49 bfs(); 50 return 0; 51 }