dfs和bfs算法
- 1. 存储图的方式一般是有两种的:邻接表和邻接矩阵,一般存储链接矩阵的方式是比较简单的,也便于我们去实现这个临接矩阵,他也就是通俗的二维数组,我们平常用到的那种。
- 2. 这里我们主要记录和讲一下bfs和dfs算法之间的一些区别和用法,他们的原理一般人是都知道的,但是他们是怎么来实现的我相信一部分人并没有去真正的实现过,包括我也是(惭愧惭愧),本人算法比较渣,所以过来恶补一下。我就先从dfs开始吧。
- 2.1 dfs 深度优先遍历
- 顾名思义:深度优先,就是一直是往深处遍历,直到没有路走为止,再回过头来找到最开始那个没路的位置换一条路再进行上面那个操作,往深处钻。递归的方式比较简单,下面上一下代码,测试通过。
#include<iostream>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <fstream>
using namespace std; int array[][];
bool visited[]; void input_graph(){ for (int i = ; i <= ; i++)
for( int j = ; j <= ; j++)
cin>>array[i][j];
} void dfs_graph(){
void dfs(int v);
memset(visited, false, sizeof(visited)); for (int i = ; i <= ; i++)// 遍历每一个节点,主要是为了当图不是连通的时候无法访问所有的节点
if(visited[i] == false)
dfs(i);
} void dfs(int v){
//深度遍历每个节点,记录访问过的节点
int adjx(int x); cout<<"当前访问顶点:"<<v<<endl;
visited[v] = true; int adx = adjx(v);//求临接的顶点 while (adx!=){//这里就递归的进行深度搜索
if(visited[adx] == false)
dfs(adx); adx = adjx(v);
}
} int adjx(int x){//找到当前节点的临节点
for (int i = ; i <= ; i++)
if (array[x][i] == && visited[i] ==false)
return i; return ;
} int main(){
cout<<"初始化图:"<<endl;
input_graph(); cout<<"dfs遍历结果:"<<endl;
dfs_graph(); return ;
}- 我感觉递归的方式还是比较简单的,但是非递归的话比较麻烦,具体可以查看一个这位大哥写的。http://www.cnblogs.com/pengyingh/articles/2396432.html。写的通俗易懂挺好的。
- bfs 广度优先遍历
- 这个就和深度不一样了,他这个就相当于是先遍历当前层的,然后再一层一层的往下面进行遍历,也是递归的方式。
- bfs算法其实就是一种层次遍历算法。从算法描述可以看到该算法要用到队列这一数据结构。我这
里用STL中的<queue>实现。该算法由于不是递归算法,所以程序流程是清晰的。
#include<iostream>
#include<queue>
using namespace std; int a[][];
bool visited[]; void store_graph()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
cin>>a[i][j];
} void bfs_graph()
{
void bfs(int v); memset(visited,false,sizeof(visited)); for(int i=;i<=;i++)
if(visited[i]==false)
bfs(i);
} void bfs(int v)
{
int Adj(int x); queue<int> myqueue;
int adj,temp; cout<<v<<" ";
visited[v]=true;
myqueue.push(v); while(!myqueue.empty()) //队列非空表示还有顶点未遍历到
{
temp=myqueue.front(); //获得队列头元素
myqueue.pop(); //头元素出对 adj=Adj(temp);
while(adj!=)
{
if(visited[adj]==false)
{
cout<<adj<<" ";
visited[adj]=true;
myqueue.push(adj); //进对
} adj=Adj(temp);
}
}
} int Adj(int x)
{
for(int i=;i<=;i++)
if(a[x][i]== && visited[i]==false)
return i; return ;
} int main()
{
cout<<"初始化图:"<<endl;
store_graph(); cout<<"bfs遍历结果:"<<endl;
bfs_graph(); return ;
}
- 2.1 dfs 深度优先遍历
dfs和bfs算法的更多相关文章
- 邻接表实现Dijkstra算法以及DFS与BFS算法
//============================================================================ // Name : ListDijkstr ...
- 基本DFS与BFS算法(C++实现)
样图: DFS:深度优先搜索,是一个不断探查和回溯的过程,每探查一步就将该步访问位置为true,接着在该点所有邻接节点中,找出尚未访问过的一个,将其作为下个探查的目标,接着对这个目标进行相同的操作,直 ...
- 图的DFS与BFS遍历
一.图的基本概念 1.邻接点:对于无向图无v1 与v2之间有一条弧,则称v1与v2互为邻接点:对于有向图而言<v1,v2>代表有一条从v1到v2的弧,则称v2为v1的邻接点. 2.度:就是 ...
- 图的遍历算法:DFS、BFS
在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS). DFS(深度优先搜索)算法 Depth-First-Search 深度优先 ...
- BFS与DFS常考算法整理
BFS与DFS常考算法整理 Preface BFS(Breath-First Search,广度优先搜索)与DFS(Depth-First Search,深度优先搜索)是两种针对树与图数据结构的遍历或 ...
- 【数据结构与算法笔记04】对图搜索策略的一些思考(包括DFS和BFS)
图搜索策略 这里的"图搜索策略"应该怎么理解呢? 首先,是"图搜索",所谓图无非就是由节点和边组成的,那么图搜索也就是将这个图中所有的节点和边都访问一遍. 其次 ...
- 图论中DFS与BFS的区别、用法、详解…
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 图论中DFS与BFS的区别、用法、详解?
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- BFS算法(——模板习题与总结)
首先需要说明的是BFS算法(广度优先算法)本质上也是枚举思想的一种体现,本身效率不是很高,当数据规模很小的时候还是可以一试的.其次很多人可能有这样的疑问,使用搜索算法的时候,到底选用DFS还是BFS, ...
随机推荐
- UVA - 1601 The Morning after Halloween (BFS/双向BFS/A*)
题目链接 挺有意思但是代码巨恶心的一道最短路搜索题. 因为图中的结点太多,应当首先考虑把隐式图转化成显式图,即对地图中可以相互连通的点之间连边,建立一个新图(由于每步不需要每个鬼都移动,所以每个点需要 ...
- webpack 插件
插件可以完成更多 loader 不能完成的功能. 插件的使用一般是在 webpack 的配置信息 plugins 选项中指定. Webpack 本身内置了一些常用的插件,还可以通过 npm 安装第三方 ...
- EJB到底是什么,真的那么神秘吗?? (转)
1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么 ...
- git之clone
git clone 命令参数: usage: git clone [options] [--] <repo> [<dir>] -v, --verbose be more ver ...
- ECMAScript6入门-序言
本系列笔记基于阮一峰大佬的开源书籍.如果大家想看可以去该地址 本系列笔记只记录本人自己学习的过程,如果有侵权收到通知会自行下架. 如果大家看到可以直接去地址处学习,如果觉得好还望支持正版. 在此感谢阮 ...
- Spring基础知识之装配Bean
装配(wiring):创建应用对象之间协作关系的行为.这是依赖注入的本质. Spring配置的可选方案 Spring提供了三种装配机智: 1)在XML中进行显示装配 2)在java中进行显示装配 3) ...
- 怎么让eclipse调试的时候不进入 class文件中去
Eclipse -> Window ->Preferences ->Java ->Debug "Suspend execution on uncaught excep ...
- 【OpenCV】基于图像处理和模式识别的火灾检测方法
学期末一直忙考试,大作业,很久没来CSDN耕耘了... 虽然考试都结束了,手头还是累积了不少活儿要补,不多写了,晒个小项目,之前一直做的,后来当做模式识别课程的大作业交了. 大体框架如下: 还是之前的 ...
- Mysql教程:[1]下载安装配置详细教程
如果不小心你下载了免安装的mysql,那么你比较倒霉,你找不到setup文件,还得自己去配置很多东西,然后再使用命令安装.所以我今天呢写一篇教程,写的尽量详细,即便是菜鸟也能安装,我自己安装过很多遍了 ...
- 简单的windows作业管理(自己也没弄透彻)
先把代码贴出来,以后有时间再研究!简单的说,作业就相当于沙箱,可以使程序在一定范围内活动. #include "stdafx.h"#include "windows.h& ...