DFS

从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈).

//使用邻接矩阵存储的无向图的深度优先遍历
template <typename Type>
void Graph<Type>::DFS()
{stack<int> iStack;showVertex(0);vertexList[0]->wasVisted = true;iStack.push(0);while (!iStack.empty()){int top = iStack.top();int v = getAdjUnvisitedVertex(top);if (v == -1){iStack.pop();}else{showVertex(v);vertexList[v]->wasVisted = true;iStack.push(v);}}//使其还可以再深/广度优先搜索for (int i = 0; i < nVerts; ++i)vertexList[i]->wasVisted = false;
}

BFS

从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0有路径相通的顶点都被访问到.

若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止(使用队列)。

//使用邻接矩阵存储的无向图的广度优先遍历
template <typename Type>
void Graph<Type>::BFS()
{queue<int> iQueue;showVertex(0);vertexList[0]->wasVisted = true;iQueue.push(0);while (!iQueue.empty()){int front = iQueue.front();iQueue.pop();int v = getAdjUnvisitedVertex(front);while (v != -1){showVertex(v);vertexList[v]->wasVisted = true;iQueue.push(v);v = getAdjUnvisitedVertex(front);}}for (int i = 0; i < nVerts; ++i)vertexList[i]->wasVisted = false;
}

附-完整代码

const int MAX_VERTS = 20;
//顶点
template <typename Type>
class Vertex
{
public:Vertex(const Type &_node = Type()): node(_node), wasVisted(false) {}public:bool wasVisted;  //增加一个访问位Type node;
};
//图
template <typename Type>
class Graph
{
public:Graph();~Graph();void addVertex(const Type &vertex);void addEdge(int start, int end);void printMatrix();void showVertex(int v);void DFS();void BFS();private:int getAdjUnvisitedVertex(int v);private:Vertex<Type>* vertexList[MAX_VERTS];int nVerts;int adjMatrix[MAX_VERTS][MAX_VERTS];
};
template <typename Type>
void Graph<Type>::DFS()
{stack<int> iStack;showVertex(0);vertexList[0]->wasVisted = true;iStack.push(0);while (!iStack.empty()){int top = iStack.top();int v = getAdjUnvisitedVertex(top);if (v == -1){iStack.pop();}else{showVertex(v);vertexList[v]->wasVisted = true;iStack.push(v);}}//使其还可以再深度优先搜索for (int i = 0; i < nVerts; ++i)vertexList[i]->wasVisted = false;
}template <typename Type>
void Graph<Type>::BFS()
{queue<int> iQueue;showVertex(0);vertexList[0]->wasVisted = true;iQueue.push(0);while (!iQueue.empty()){int front = iQueue.front();iQueue.pop();int v = getAdjUnvisitedVertex(front);while (v != -1){showVertex(v);vertexList[v]->wasVisted = true;iQueue.push(v);v = getAdjUnvisitedVertex(front);}}for (int i = 0; i < nVerts; ++i)vertexList[i]->wasVisted = false;
}
//获取下一个尚未访问的连通节点
template <typename Type>
int Graph<Type>::getAdjUnvisitedVertex(int v)
{for (int j = 0; j < nVerts; ++j){//首先是邻接的, 并且是未访问过的if ((adjMatrix[v][j] == 1) &&(vertexList[j]->wasVisted == false))return j;}return -1;
}
//打印节点信息
template <typename Type>
void Graph<Type>::showVertex(int v)
{cout << vertexList[v]->node << ' ';
}template <typename Type>
Graph<Type>::Graph():nVerts(0)
{for (int i = 0; i < MAX_VERTS; ++i)for (int j = 0; j < MAX_VERTS; ++j)adjMatrix[i][j] = 0;
}
template <typename Type>
Graph<Type>::~Graph()
{for (int i = 0; i < nVerts; ++i)delete vertexList[i];
}
template <typename Type>
void Graph<Type>::addVertex(const Type &vertex)
{vertexList[nVerts ++] = new Vertex<Type>(vertex);
}
template <typename Type>
void Graph<Type>::addEdge(int start, int end)
{//无向图adjMatrix[start][end] = 1;adjMatrix[end][start] = 1;
}
template <typename Type>
void Graph<Type>::printMatrix()
{for (int i = 0; i < nVerts; ++i){for (int j = 0; j < nVerts; ++j)cout << adjMatrix[i][j] << ' ';cout << endl;}
}//测试代码
int main()
{Graph<char> g;g.addVertex('A');   //0g.addVertex('B');   //1g.addVertex('C');   //2g.addVertex('D');   //3g.addVertex('E');   //4g.addEdge(0, 1);    //A-Bg.addEdge(0, 3);    //A-Dg.addEdge(1, 0);    //B-Ag.addEdge(1, 4);    //B-Eg.addEdge(2, 4);    //C-Eg.addEdge(3, 0);    //D-Ag.addEdge(3, 4);    //D-Eg.addEdge(4, 1);    //E-Bg.addEdge(4, 2);    //E-Cg.addEdge(4, 3);    //E-Dg.printMatrix();cout << "DFS: ";g.DFS();cout << "\nBFS: ";g.BFS();return 0;
}

数据结构基础(21) --DFS与BFS相关推荐

  1. 一文搞懂深度优先搜索、广度优先搜索(dfs、bfs)

    前言 你问一个人听过哪些算法,那么深度优先搜索(dfs)和宽度优先搜索(bfs)那肯定在其中,很多小老弟学会dfs和bfs就觉得好像懂算法了,无所不能,确实如此,学会dfs和bfs暴力搜索枚举确实利用 ...

  2. dfs、bfs的终于弄明白了

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 作者丨大赛 来源丨bigsai 前言 你问一个人听过哪些算法,那么深度优先搜索(dfs)和宽度优先搜索( ...

  3. 【数据结构笔记21】图的遍历,DFS与BFS,连通图

    本次笔记内容: 6.2.1 图的遍历 - DFS 6.2.2 图的遍历 - BFS 6.2.3 图的遍历 - 为什么需要两种遍历 6.2.4 图的遍历 - 图连不通怎么办? 文章目录 深度优先搜索(D ...

  4. 数据结构与算法—图论之dfs、bfs(深度优先搜索、宽度优先搜索)

    文章目录 前言 邻接矩阵和邻接表 深度优先搜索(dfs) 宽度(广度)优先搜索(bfs) 总结与比较 前言 在有向图和无向图中,如果节点之间无权值或者权值相等,那么dfs和bfs时常出现在日常算法中. ...

  5. 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...

  6. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  7. 数据结构 --- 图的遍历 DFS、BFS

    什么是DFS.BFS? 一条线走到底,深度优先遍历,每一个顶点只遍历.只打印一次的方式:DFS.BFS 数据结构 --- 图的存储 单纯地把邻接顶点的邻接顶点打印出来,顶点重复遍历,打印多次 从 A→ ...

  8. 【基础算法】DFS和BFS

    DFS和BFS都是图的搜素算法 DFS:深度优先搜索,存放候补节点的数据结构是栈(先进后出) BFS:广度优先搜索,存放候补节点的数据结构是队列(先进先出) 0. 分析 我们将顶点1作为搜索的起点. ...

  9. 搜素算法(基础)--DFS/BFS算法(JAVA)

    DFS.BFS的定义及C语言算法实现请参照 连通图遍历策略之深度优先搜索(C语言) 连通图遍历策略之广度优先搜索(C语言) 为了便于理解这里的数据是一个无向图,要求输出遍历顺序 下面只给出用例和算法, ...

最新文章

  1. Linux Centos6.5 SVN服务器搭建 以及客户端安装
  2. [转]C#多线程学习(三) 生产者和消费者
  3. 【腾讯Bugly干货分享】动态链接库加载原理及HotFix方案介绍
  4. 哪些名人在学python_盘点计算机界十位顶级人物,看看你认识几个?
  5. java能不能修改文件大小信息_java上机考试3
  6. markdown 入门1--标题目录代码图片
  7. java自动触发_我们可以自动使用应用程序触发器调用后台任
  8. java synchronized讨论
  9. Pannellum:实例之在部分视角内展示全景图
  10. Java微信公众平台开发(十五)--微信JSSDK的使用
  11. 图论基础(Tarjan与拓扑排序)
  12. haswell架构_一个月拥有Intel Haswell原型
  13. IR2301高电压,高速功率MOSFET和IGBT驱动器介绍
  14. NAS媒体库资源归集整理工具nas-tools
  15. 毕业论文引言 文献综述 摘要有什么区别?
  16. 【渝粤教育】广东开放大学 动画运动规律 形成性考核 (25)
  17. 热修复原理学习(1)热修复技术介绍
  18. 网络安全中接口测试的解决方案
  19. HTTP 接口设计指北
  20. python输入坐标求面积_利用python中的坐标计算多边形面积

热门文章

  1. 阿里云前端周刊 - 第 39 期
  2. 为什么说Python是伟大的入门语言
  3. 标准差、方差、协方差的简单说明
  4. 腾讯、网易邮箱设置POP3客户端代理
  5. Elixir: 多太(Polymorphism)
  6. oracle10g获取Date类型字段无时分秒解决办法!
  7. lpq命令--Linux命令应用大词典729个命令解读
  8. ScrollView中嵌套ListView控件,数据无法显示完全
  9. #1045 - Access denied for user 'root'@'localhost' (using password: NO)
  10. Maven学习六之利用mvn deploy命令上传包