看正月點燈籠老師的筆記—BFS和DFS ( 1 )

 代碼基本抄自   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;
}
相關文章
相關標籤/搜索