学习笔记:图的DFS和BFS的两种搜索办法

Posted Madao东治

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记:图的DFS和BFS的两种搜索办法相关的知识,希望对你有一定的参考价值。

 

 

在学习图结构的过程中,DFS和BFS是两种不同的遍历方式,其寻找元素具有不同的优点和缺陷。

 

BFS被称作广度优先算法, 在遍历整个图的过程中,BFS将采用入队的方式进行,值得一提的是,这和树结构中的层序遍历有很大的相似之处。

在层序遍历中,将父亲节点入队后,在父亲节点出队后,将其儿子节点入队。

同理在图的BFS遍历中,先让BFS的首元素入队,在收元素入队后将他的儿子节点入队,放能够实现BFS搜索,他们的整体思想是一样的。

 

 1 void TraversalGraph_BFS(LGraph Graph,Vertex vertex){
 2     Visit(vertex);
 3     VISIT[vertex]=1;
 4     enqueue(queue,vertex);
 5     while(!isEmpty(queue)){
 6         DelQueue(queue);
 7         for(w=Graph->G[vertex].FirstNode;w;w=w->Next){
 8             if(!Visit[w]){
 9                 Visit[w];
10                 Visit[w->vertex]=1;
11                 enqueue(queue,w);
12             }
13         }
14     }
15 }

 

DFS又被称作深度优先算法,与BFS不同的是,DFS会首先遍历其儿子节点,这样有点类似在树结构中的前序遍历。

在理解方面相比比较容易,DFS采用了递归的思路,在用链表实现DFS时,思路是当遇到一个没有遍历的节点,则进入该节点,然后同理往下递归,直到某个节点无法在继续则返回。

1 void TraversalGraph_DFS(LGraph Graph,Vertex vertex,void(*Visit)(Vertex)){
2     PtrToAdjVNode W;
3     Visit(vertex);
4     Visit[vertex]=1;
5     for(w=Graph->G[vertex].FirstNode;w;w=w->Next){
6         if(!Visit[w->vertex])
7             TraversalGraph_DFS(Graph,w->Vertex)
8     }
9 }

 

下面是程序结构体的前置定义

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 typedef struct Enode *PtrToEnode;
 5 typedef int Vertex;
 6 typedef int WeightType;
 7 typedef DataType Data;
 8 struct Enode{
 9     Vertex v1,v2;
10     WeightType Weight;
11 };
12 typedef PtrToEnode Edge;
13 
14 typedef struct AdjVNode *PtrToAdjVNode;
15 struct AdjVNode{
16     Vertex vertex;
17     WeightType Weight;
18     PtrToAdjVNode Next;
19 };
20 
21 typedef struct HeadNode *PtrToHead;
22 struct HeadNode{
23     PtrToAdjVNode FirstNode;
24     DataType Data;
25 }HeadNode[Max];
26 
27 typedef struct Graph *PtrToGNode;
28 struct Graph{
29     int Ne;
30     int Nv;
31     HeadNode G;
32 };
33 typedef *PtrToGNode LGraph;
34 
35 LGraph creatGraph(int MaxNumb){
36     LGraph Graph;
37     Graph=(LGraph)malloc(sizeof(struct Graph));
38     Graph->Ne=0;
39     Graph->Nv=MaxNumb;
40     for(i=0;i<Graph->Nv;i++){
41         Graph->G[i].FirstNode=NULL;
42     }
43     return(Graph);
44 }
45 
46 void Insert(LGraph Graph,Edge E){
47     AdjVNode NewNode;
48     NewNode=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode))
49     NewNode->Weight=E->W;
50     NewNode->vertex=E->v1
51     Graph->G[E->v2].Next=NewNode->Next;
52     Graph->G[E->v2].Next=NewNode;
53 }
54 
55 void Visit(LGraph Graph){
56     printf("Now VISIT %d",V);
57 }

 

以上是关于学习笔记:图的DFS和BFS的两种搜索办法的主要内容,如果未能解决你的问题,请参考以下文章

图的两种遍历-DFS&BFS

图的两种存储(邻接矩阵和邻接表)和两种遍历(DFS和BFS)

数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

019-dfs.bfs-图的遍历-《算法设计技巧与分析》M.H.A学习笔记

数据结构学习笔记——图的遍历(深度优先搜索和广度优先搜索)