无向图的深度优先与广度优先搜索代码实现

图采用了邻接表的形式储存。

带不带权都无所谓的

深度优先搜索 Depth First Search

道理和树的先序遍历差不多,把将要访问的点入栈,然后从栈里取点进行访问。

由于这只是类中的一个成员函数,有些被调用的函数的具体代码将会在文章最后补上 ,但是函数功能看注释就好了

 1 //深度优先
 2 void GraphAdjacencyListWeight::DFSAdvanced(int StartVertex) {
 3     int *visited = new int[VertexNumber];
 4     //手动初始化
 5     //不知道为什么memset不好用
 6     for (int lop = 0; lop < VertexNumber; lop++) {
 7         visited[lop] = 0;
 8     }
 9
10     stack<int> S;
11     S.push(StartVertex);
12
13     int NextVertex = -1;
14
15     while (!IsAllVisited(visited)) {
16         //如果有其他的连通分量
17         if (S.empty()) {
18             //随便找一个没被访问的点丢进栈
19             for (int lop = 0; lop < VertexNumber; lop++) {
20                 if (visited[lop] == 0) {
21                     S.push(lop);
22                     break;
23                 }
24             }
25         }
26         while(!S.empty()) {
27             NextVertex = S.top();
28             S.pop();
29
30             if (visited[NextVertex] != 1) {
31                 //访问该点
32                 VisitVertex(NextVertex);
33                 //标记为访问过
34                 visited[NextVertex] = 1;
35                 //将下一个没被访问过的邻接点入栈
36                 PushValidVertexToStack(S, NextVertex, visited);
37             }
38         }
39     }
40 }

DFS

令人惊讶的是广度优先搜索与深度优先搜索的代码居然是几乎相同的,除了栈换成队列。。。惊呆,这让我有点怀疑我代码的正确性。。。还请大神们指点指点

广度优先搜索 Breadth First Search

广度优先搜索的过程和树的层序遍历类似

 1 //广度优先
 2 void GraphAdjacencyListWeight::BFSAdvanced(int StartVertex) {
 3     int *visited = new int[VertexNumber];
 4     //手动初始化
 5     //不知道为什么memset不好用
 6     for (int lop = 0; lop < VertexNumber; lop++) {
 7         visited[lop] = 0;
 8     }
 9
10     queue<int> Q;
11     Q.push(StartVertex);
12
13     //下一个将要访问的顶点的序号
14     int NextVertex = -1;
15
16     //当还有顶点没被访问时
17     while (!IsAllVisited(visited)) {
18         //如果有其他的连通分量
19         if (Q.empty()) {
20             //随便找一个没被访问的点丢进队列
21             for (int lop = 0; lop < VertexNumber; lop++) {
22                 if (visited[lop] == 0) {
23                     Q.push(lop);
24                     break;
25                 }
26             }
27         }
28
29         while (!Q.empty()) {
30             //获取队列前端元素
31             NextVertex = Q.front();
32             Q.pop();
33
34             //如果该点没被访问过
35             if (visited[NextVertex] != 1) {
36                 //访问该点
37                 VisitVertex(NextVertex);
38                 //标记为访问过
39                 visited[NextVertex] = 1;
40                 //将该点的邻接点入队
41                 EnQueueAllAdjVer(Q, NextVertex);
42             }
43         }
44     }
45 }

BFS

下面贴上完整的用到的函数的代码

 1 int GraphAdjacencyListWeight::IsAllVisited(int visit[]) {
 2     for (int lop = 0; lop < VertexNumber; lop++) {
 3         if (visit[lop] == 0) {
 4             return 0;
 5         }
 6     }
 7     return 1;
 8 }
 9
10 void GraphAdjacencyListWeight::VisitVertex(int i) {
11     cout << "Vertex : " << VectorVertexList[i]->VertexIndex << endl;
12 }
13
14 void GraphAdjacencyListWeight::EnQueueAllAdjVer(queue<int> &Q, int index) {
15     for (auto tmpPtr = VectorVertexList[index]->firstArc; tmpPtr != nullptr; tmpPtr = tmpPtr->nextArc) {
16         Q.push(tmpPtr->AdjacencyNode);
17     }
18 }
19
20 void GraphAdjacencyListWeight::PushValidVertexToStack(stack<int> &S, int index, int visit[]) {
21     for (auto Ptr = VectorVertexList[index]->firstArc; Ptr != nullptr; Ptr = Ptr->nextArc) {
22         if (visit[Ptr->AdjacencyNode] != 1) {
23             S.push(Ptr->AdjacencyNode);
24             return;
25         }
26     }
27 }

Functions

 全部代码请看 GitHub

时间: 2024-10-21 08:41:37

无向图的深度优先与广度优先搜索代码实现的相关文章

图的遍历(深度优先与广度优先搜索两种方案)

1.图的遍历--深度优先搜索 import java.util.Scanner ; public class Map{ static int n ; static int m ; static int[] book ; static int[][] e ; public static void mapDfs(int cur){ //深度优先搜索思想核心: System.out.print(cur + " ") ; for (int i=1;i<=n;i++) { if (e[cu

看数据结构写代码(40) 无向图的深度优先生成树与广度优先生成树

图的深度优先遍历 和 广度 优先 遍历 算法中的 每一次 最外层 循环 都 产生 一个 无向图 的 连通分量,每一个连通分量,都可以产生一个生成树,将这些生成树合在 一起 就是 一个 森林. 用 树的 孩子 兄弟 链表 表示法 来 表示 这个 森林, 就是 这一节 算法的  内容. 深度优先森林 代码 : //深度优先生成森林 void dfsTree(AMLGraph g,int i,Tree * t,bool isVisited[]){ isVisited[i] = true; bool i

算法-无向图(深度优先搜索和广度优先搜索)

图中最常用到的两种搜索深度优先搜索和广度优先搜索,深度优先搜索是一种在开发爬虫早期使用较多的方法它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链接的Html文件) ,广度搜索属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止. 深度优先搜索 图中我们经常会遇到一个问题就是图的连通性,比如说从一个顶点到另外一个顶点,判断顶点和其他顶点之间的连通性,以下图为例: 搜索API定义: @interface

算法_图的深度优先搜索和广度优先搜索

一.图的基本数据结构 图是由一组顶点和一组能够将两个顶点相互连接的边所构成的,一般使用0~V-1这样的数字形式来表示一张含有V个顶点的图.用v-w来指代一张图的边,由于是无向图,因此v-w和w-v是同一种边的两种表示方法.无向图是指边没有方向的图结构在无向图中,边仅仅表示的是两个顶点之间的连接.图的数据结构的可视化如下图所示(其中边上的箭头没有任何意义): 当两个顶点通过一条边相互连接,则称这两个顶点是相邻的.某个顶点的度数即为依附它的边的总数.当两个顶点之间存在一条连接双方的路径的时候,称为这

数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历

图有四种存储结构:数组,邻接表,十字链表,邻接多重表.下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历.其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含.具体代码如下: //图的数组(邻接矩阵)存储表示和深度优先遍历 const int MAX_VERTEX_NUM=20; //最大顶点数 typedef enum {DG,DN,UDG,UDN} GraphKind ;//(有向图,有向网,无向图,无向网) typedef int VRType; typedef

十大基础实用算法之深度优先搜索和广度优先搜索

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.它沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.DFS属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相

深度优先搜索、广度优先搜索

1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到. 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止. 显然,深度优先搜索是一个递归的过程. 2. 深度优先搜索图解 2.1 无向图的深度优先搜索

图的遍历之 深度优先搜索和广度优先搜索

本章会先对图的深度优先搜索和广度优先搜索进行介绍,然后再给出C/C++/Java的实现. 目录 1. 深度优先搜索的图文介绍 1.1 深度优先搜索介绍 1.2 深度优先搜索图解 2. 广度优先搜索的图文介绍 2.1 广度优先搜索介绍 2.2 广度优先搜索图解 3. 搜索算法的源码 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然

“生动”讲解——深度优先搜索与广度优先搜索

深度优先搜索(Depth First Search,DFS) 主要思想:不撞南墙不回头 深度优先遍历的主要思想就是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点:当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问. 沿着某条路径遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止. 图解: 分析: 通过上面的图例可以非常直观的了解深度优先搜索的工作方式.下面来分析一下如何用代码来实现它. 大家都知道,深度