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, ...
随机推荐
- 浅谈FFT(快速傅里叶变换)
本文主要简单写写自己在算法竞赛中学习FFT的经历以及一些自己的理解和想法. FFT的介绍以及入门就不赘述了,网上有许多相关的资料,入门的话推荐这篇博客:FFT(最详细最通俗的入门手册),里面介绍得很详 ...
- Network Saboteur (深搜递归思想的特殊使用)
个人心得:对于深搜的使用还是不到位,对于递归的含义还是不太清楚!本来想着用深搜构成一个排列,然后从一到n分割成俩个数组,然后后面发现根本实现不了,思路太混乱.后来借鉴了网上的思想,发现用数组来标志,当 ...
- webpack 单页面应用实战
这篇文章将介绍如何利用 webpack 进行单页面应用的开发,算是我在实际开发中的一些心得和体会,在这里给大家做一个分享.webpack 的介绍这里就不多说了,可以直接去官网查看. 关于这个单页面应用 ...
- 修改git commit 最后一次提交的注释信息 以及如何退出git bash vim编辑器
https://www.cnblogs.com/sandy-happyhour/p/5950084.html 今天用git commit -m “注释”提交的时候,注释写错了,于是各种查资料开始了和g ...
- spark远程调试
基本流程1.远程运行spark,打开Spark master机器的JVM的jdwp,让其阻塞监听指定端口(8888),让其有终端向指定端口发送特定请求再执行:2.IntelliJ配置socket远程连 ...
- 洛谷 4245 【模板】任意模数NTT——三模数NTT / 拆系数FFT
题目:https://www.luogu.org/problemnew/show/P4245 三模数NTT: 大概是用3个模数分别做一遍,用中国剩余定理合并. 前两个合并起来变成一个 long lon ...
- BZOJ3262:陌上花开
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...
- C#中获取Excel文件的第一个表名
// 2.以数据库方式打开并输入数据// 此方式将xls文件所在目录看作数据库,其中的xls文件看作数据库表,表名即文件名(不加扩展名).// 函数importExcelTo ...
- 非常不错的LTE架构讲解
<LTE系统协议架构---通俗易懂超经典> <3GPP协议导读> <3GPP协议36211-850中文翻译> <LTE全套协议汇总> <NB-IO ...
- 机器学习:逻辑回归(scikit-learn 中的逻辑回归)
一.基础理解 使用逻辑回归算法训练模型时,为模型引入多项式项,使模型生成不规则的决策边界,对非线性的数据进行分类: 问题:引入多项式项后,模型变的复杂,可能产生过拟合现象: 方案:对模型正则化处理,损 ...