视频地址:https://www.bilibili.com/video/av25763384/?spm_id_from=333.788.videocard.0
代码基本抄自 https://blog.csdn.net/qq_34823530/article/details/99202899
但它的 DFS 是用栈,我觉 vector 既可以完成 BFS 也可以 完成 DFS ,所以,就将其改成 vector
如下:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<vector> #include<map> using namespace std; void BFS(map<char, vector<char>>graph, char s) { vector<char>queue, seen; queue.push_back(s); seen.push_back(s); char vertex; while (queue.size() > 0) { vertex = queue.front(); // 取第一个元素 queue.erase(queue.begin()); // 出队列 vector <char> nodes = graph[vertex]; // 取所连接的结点 for (char w : nodes) // 循环结点 { auto ret = find(seen.begin(), seen.end(), w); if (ret == seen.end()) // 如果找到一个还没出现过的结点 { queue.push_back(w); // 入队 seen.push_back(w); // 标记此结点找过了 } } printf("%c ", vertex); }puts(""); } void DFS(map<char, vector<char>>graph, char s) { vector<char>stack, seen; stack.push_back(s); seen.push_back(s); char vertex; while (stack.size() > 0) { vertex = stack.back(); // 取第一个元素 stack.erase(stack.end() - 1); // 出栈 vector <char> nodes = graph[vertex]; // 取所连接的结点 for (char w : nodes) // 循环结点 { auto ret = find(seen.begin(), seen.end(), w); if (ret == seen.end()) // 如果找到一个还没出现过的结点 { stack.push_back(w); // 入栈 seen.push_back(w); // 标记此结点找过了 } } printf("%c ", vertex); }puts(""); } int main(void) { vector<char> a{ 'B', 'C' }; vector<char> b{ 'A', 'C', 'D' }; vector<char> c{ 'A', 'B', 'D','E' }; vector<char> d{ 'B', 'C', 'E','F' }; vector<char> e{ 'C', 'D' }; vector<char> f{ 'D' }; map <char, vector<char>> graph // 定义一个(结点 映射 结点所连接的结点) 的图表 { { 'A',a },{ 'B',b },{ 'C',c },{ 'D',d },{ 'E',e },{ 'F',f } }; BFS(graph, 'A'); DFS(graph, 'A'); system("pause"); return 0; }
队列是先进先出,栈是先进后出,所以两者进数组的顺序是一样的,只是出去的顺序不一样.
而 vector 可以 用 c.push_back(w) 模拟 入队和入栈
用 c.frond + c.erase(c.begin()) 模拟 出队列
用 c.back + c.erase(c.end()-1) 模拟 出栈
所以 vertex 可以同时实现 队列和栈的功能。
下面是图:
1,BFS
以上是 队列(向量) 的状态
其中 seen 的状态我没有画出来,
首先,他的初始化状态与队列一样,只有一个 A,
然后,从第一个 for 循环开始,每次放进队列的,同时也有放进 seen 里面。
综上,就是 BFS:
由于他是先进先出的,且每次只搜索到下一层就轮到下一个了
所以每次同时放进队列的相邻结点A,B,C 都是按顺序来的,
只是 A 先搜索其子节点,等其搜索完之后,就轮到 B,再 C。
2,DFS
以上是 栈(向量) 的状态
其中 seen 的状态我没有画出来,
首先,他的初始化状态与队列一样,只有一个 A,
然后,从第一个 for 循环开始,每次放进栈的,同时也有放进 seen 里面。
综上,就是 DFS:
即使每次只搜索到下一层就轮到下一个了,由于他是先进后出的
所以每次同时放进队列的相邻结点A,B,C 的并不按照这个顺序来,
它是 A 先搜索其子节点,等其搜索完之后,把它的子节点 D,E 放入栈,所以变成轮到 E , 再 D,如此。