图的深度优先遍历(DFS)和广度优先遍历(BFS)
body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
右图是递归遍历的过程,其实每一层都是从A结点开始搜寻满足条件的点 |
|
|
/* DFS.h */
#ifndef __DFS_H__
#define __DFS_H__
#include"Graph.h"
namespace meihao
{
void DFS(const meihao::Graph& g,int vi,bool*& visited); //参数->图和顶点数组中某个顶点的下标
void DFSTraversal(const meihao::Graph& g);
};
#endif
/* testMain.cpp */ #include"DFS.h"
#include<iostream>
int main()
{
meihao::Graph g("data.txt");
meihao::DFSTraversal(g);
cout<<endl;
system("pause");
}
/* data.txt */ 9
A B C D E F G H I
0 1 0 0 0 1 0 0 0
1 0 1 0 0 0 1 0 1
0 1 0 1 0 0 0 0 1
0 0 1 0 1 0 1 1 1
0 0 0 1 0 1 0 1 0
1 0 0 0 1 0 1 0 0
0 1 0 1 0 1 0 1 0
0 0 0 1 1 0 1 0 0
0 1 1 1 0 0 0 0 0
|
/* DFS.cpp */
#include"DFS.h"
namespace meihao
{
//算法都是基于邻接矩阵实现的
void DFS(const meihao::Graph& g,int vi,bool*& visited)
{
visited[vi] = true; //修改第vi个结点的访问标记为true
cout<<g.getGraphVertexData(vi)<<" ";
for(int idx=0;idx!=g.getGraphVertexNumber();++idx)
{
if(1==g.getGraphEdgeWeight(vi,idx)&&
false==visited[idx]) //如果(vi,idx)之间存在边(==1),并且第idx个顶点还没有访问过
{
DFS(g,idx,visited); //递归遍历第idx个顶点
}
}
}
void DFSTraversal(const meihao::Graph& g)
{
bool* visited = new bool[g.getGraphVertexNumber()]();
for(int idx=0;idx!=g.getGraphVertexNumber();++idx)
{
visited[idx] = false; //初始化访问标记,全部为false,表示未访问
}
for(int idx=0;idx!=g.getGraphVertexNumber();++idx)
{
if(false==visited[idx]) //随便选一个点,如果未访问过,就从它开始深度优先遍历
DFS(g,idx,visited);
}
}
};
|
| /* BFS.h */
#ifndef __BFS_H__
#define __BFS_H__
#include"Graph.h"
namespace meihao
{
void BFSTraversal(const meihao::Graph& g);
};
#endif
/* test.cpp */ #include"BFS.h"
#include<iostream>
int main()
{
meihao::Graph g("data.txt");
meihao::BFSTraversal(g);
cout<<endl;
system("pause");
}
/* data.txt */
9
A B C D E F G H I
0 1 0 0 0 1 0 0 0
1 0 1 0 0 0 1 0 1
0 1 0 1 0 0 0 0 1
0 0 1 0 1 0 1 1 1
0 0 0 1 0 1 0 1 0
1 0 0 0 1 0 1 0 0
0 1 0 1 0 1 0 1 0
0 0 0 1 1 0 1 0 0
0 1 1 1 0 0 0 0 0
|
/* BFS.cpp */
#include"BFS.h"
#include<queue>
namespace meihao
{
void BFSTraversal(const meihao::Graph& g)
{ //广度优先遍历相当于层序遍历
queue<int> rootNode; //存放图的顶点
bool* visited = new bool[g.getGraphVertexNumber()];
for(int idx=0;idx!=g.getGraphVertexNumber();++idx)
{
visited[idx] = false;
}
for(int idx=0;idx!=g.getGraphVertexNumber();++idx)
{ //if语句可以确保如果图中有多个连通分量,也能每个点都访问到
if(false==visited[idx]) //如果该结点没有访问到
{
//访问
cout<<g.getGraphVertexData(idx)<<" ";
visited[idx] = true;
rootNode.push(idx);
while(!rootNode.empty()) //把刚刚访问到的结点的下一层结点访问并入队列
{
for(int iidx=0;iidx!=g.getGraphVertexNumber();++iidx)
{
if(1==g.getGraphEdgeWeight(rootNode.front(),iidx)&&
false==visited[iidx])
{
cout<<g.getGraphVertexData(iidx)<<" ";
visited[iidx] = true;
rootNode.push(iidx);
}
}
rootNode.pop(); //最先访问的一个结点出队列
}
}
}
}
};
|
图的深度优先遍历(DFS)和广度优先遍历(BFS)的更多相关文章
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析
1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...
- 深度优先搜索DFS和广度优先搜索BFS
DFS简介 深度优先搜索,一般会设置一个数组visited记录每个顶点的访问状态,初始状态图中所有顶点均未被访问,从某个未被访问过的顶点开始按照某个原则一直往深处访问,访问的过程中随时更新数组visi ...
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- 【C++】基于邻接矩阵的图的深度优先遍历(DFS)和广度优先遍历(BFS)
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 图的深度优先搜索dfs
图的深度优先搜索: 1.将最初访问的顶点压入栈: 2.只要栈中仍有顶点,就循环进行下述操作: (1)访问栈顶部的顶点u: (2)从当前访问的顶点u 移动至顶点v 时,将v 压入栈.如果当前顶点u 不存 ...
随机推荐
- SpringBoot集成TkMybatis插件 (二)
一.Tkmybatis的好处 Tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效.这个插件里面封装好了我们需要用到的很多sql语句,不过这个插件是通过我们去调用它封装的各种 ...
- 雷林鹏分享:查看 XML 文件
查看 XML 文件 在所有主流的浏览器中,均能够查看原始的 XML 文件. 不要指望 XML 文件会直接显示为 HTML 页面. 查看 XML 文件 - Tove Jani Reminder Don' ...
- navicat和 plsql 连接oracle数据库 总结
打开 navicat -->工具-->选项-->oci 右侧选择oci.dll 的路径 默认 在 navicat的安装目录下有一个 instantclient 的文件夹 直接选 ...
- stock 基本操作
追涨停 量比 大于5 0%-2% 个股 2点卖 37分钟买 板块5 -8 只涨停 板块分向标 追踪短期个股的涨跌现象 明白市场大级别趋势 主 ...
- P2469 [SDOI2010]星际竞速
在何Au的讲解下终于搞明白了这个以前的坑. 首先考虑最小路径覆盖. 这个题意又要求我们求出的最大流为n-1(这样才能保证路径为1条) 考虑高速航行模式的图怎么建,只需要保证最大流的同时费用最小即可,显 ...
- 『MXNet』第七弹_多GPU并行程序设计
资料原文 一.概述思路 假设一台机器上有个GPU.给定需要训练的模型,每个GPU将分别独立维护一份完整的模型参数. 在模型训练的任意一次迭代中,给定一个小批量,我们将该批量中的样本划分成份并分给每个G ...
- windows远程以及文件共享方法总结
文件共享部分 紧接着下一步[允许使用空密码] 参考这个链接 https://jingyan.baidu.com/article/7f766dafa8c5ee4100e1d071.html 在我们使用w ...
- yum源仓库搭建
系统:centos7 一.安装nginx yum install -y nginx yum install -y createrepo 安装建yum源仓库的工具,可以用来建立yum仓库yum ...
- <Matlab-3:追赶法(Doolittle分解)工具箱
function x=chase (d,e,f,b) % --------------------------------------------------------------- %the me ...
- js定义类
以下是es5标准里定义类的方法: function Point(x,y){ this.x=x; this.y=y; } Point.prototype.toString=function(){ ret ...