zoukankan      html  css  js  c++  java
  • 看正月点灯笼老师的笔记—BFS和DFS ( 1 )

    视频地址: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,如此。

  • 相关阅读:
    css学习之LInk & import
    用javascript制作2048游戏的思路(原创若 转载请附上本链接)
    Sublime Text2中的快捷键一览表(Sublime 键盘快捷键大全 )
    《Scrum实战》第1次课课后任务
    反省读经教育理论的误区 ——关于十三岁之前理解的问题
    王守仁的学前教育思想
    孙氏太极拳--无极桩
    秘静克老人的站桩
    敏捷领域学习规划
    同侪隐修录 (2016-12-25 23:10:21)转载▼
  • 原文地址:https://www.cnblogs.com/asdfknjhu/p/12431684.html
Copyright © 2011-2022 走看看