代码基本抄自 https://blog.csdn.net/qq_34823530/article/details/99202899node
但它的 DFS 是用栈,我觉 vector 既能够完成 BFS 也能够 完成 DFS ,因此,就将其改为 vectorspa
以下:.net
#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; }