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, ...
随机推荐
- CodeForces - 961D:Pair Of Lines (几何,问两条直线是否可以覆盖所有点)
You are given n points on Cartesian plane. Every point is a lattice point (i. e. both of its coordin ...
- Spring MVC配置文件的三个常用配置详解
转自:http://www.cnblogs.com/benwu/articles/5162614.html Spring MVC项目中通常会有二个配置文件,sprng-servlet.xml和appl ...
- 2825 codevs危险的组合(递推)
2825 危险的组合 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一些装有铀(用U表示)和铅(用L表示)的盒子,数量均足够 ...
- 【ASP.NET Web API2】利用HttpClient调用Web API(TODO)
参照: 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 纯属记录一下遇到的问题: 我们利用HttpClient来调用自宿主方式寄宿的Web API.HttpCl ...
- python basestring()
作用: basestring是str和unicode的超类(父类),也是抽象类,因此不能被调用和实例化,但可以被用来判断一个对象是否为str或者unicode的实例,isinstance(obj, b ...
- Qt中int转换成QString
(1) QString QString::number ( long n, int base = 10 ) [static] examle: long a = 48; QString s = QStr ...
- Linux下markdown编辑软件 — retext 支持实时预览,存为pdf、html、ODT等
本文由Suzzz原创,发布于 http://www.cnblogs.com/Suzzz/p/4129368.html,转载请保留此声明 ReText是一个linux下的markdown和reStruc ...
- BZOJ4198:[NOI2015]荷马史诗
浅谈\(Huffman\)树:https://www.cnblogs.com/AKMer/p/10300870.html 题目传送门:https://lydsy.com/JudgeOnline/pro ...
- [Angularjs-学习笔记]工具篇
因为一开始学习前端知识一直都是在慕课网,所以这次准备学习下angularjs等了好久,终于慕课网出了angularjs的内容,于是准备开始跟着老师的步骤进行学习. 大漠老师关于开发工具的内容讲得比较快 ...
- 开发环境入门 linux基础 (部分)正则表达式 grep sed
/etc/profile /etc/bashrc .变量添加到shell环境中,永久生效. /root/.bashrc /root/.bash_profile 正则表达式 定义:正则就是用一些具有特 ...