数据结构--DFS和BFS

专题--深度优先搜索与广度优先搜索

知识点:

  邻接矩阵结构;

  DFS深度优先搜索;

  BFS广度优先搜索。

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4
 5 typedef char VertexType;
 6 typedef int EdgeType;
 7 const int MAXVEX=100;
 8 const int INFINITY=65535;
 9
10 struct MGraph
11 {
12     VertexType vexs[MAXVEX];      //顶点表
13     EdgeType arc[MAXVEX][MAXVEX]; //邻接矩阵,可看做边表
14     int numVertexes,numEdges;     //图中当前的顶点数和边数
15 };
16
17 //深度优先
18 void DFS(MGraph,int);  //函数前置声明
19 bool visited[MAXVEX];
20 void DFSTraverse(MGraph G)
21 {
22     for(int i=0;i<G.numVertexes;++i)
23         visited[i]=false;
24     for(int i=0;i<G.numVertexes;++i)
25         if(!visited[i])
26             DFS(G,i);   //若是连通图,只会执行一次
27 }
28 void DFS(MGraph G,int i)
29 {
30     visited[i]=true;
31     cout<<G.vexs[i]<<endl;
32
33     for(int j=0;j<G.numVertexes;++j)
34         if(G.arc[i][j]==1&&!visited[j])  //有连接且还未访问
35             DFS(G,j);    //递归调用
36 }
37 //广度优先
38 void BFSTraverse(MGraph G)
39 {
40     for(int i=0;i<G.numVertexes;++i)
41         visited[i]=false;
42     queue<int> Q;  //申请一个辅助队列
43     for(int i=0;i<G.numVertexes;++i)
44     {
45         visited[i]=true;
46         cout<<G.vexs[i]<<endl;
47
48         Q.push(i); //入队列
49         while(!Q.empty())
50         {
51             int i=Q.front(); //取出首元素
52             Q.pop();   //删除队列首元素
53             for(int j=0;j<G.numVertexes;++j)
54             {
55                 if(G.arc[i][j]==1&&!visited[j])
56                 {
57                     visited[j]=true;
58                     Q.push(j);   //入队列
59                 }
60             }
61         }
62     }
63
64 }
时间: 2024-11-08 17:03:42

数据结构--DFS和BFS的相关文章

数据结构(11) -- 邻接表存储图的DFS和BFS

/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS /////////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> #include <queue> using namespace std; //图的邻接表表示法

数据结构(12) -- 图的邻接矩阵的DFS和BFS

//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS //////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> #include <queue> #define MaxVertexNum 100 //最大顶点数 //#define INFINI

数据结构基础(21) --DFS与BFS

DFS 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈). //使用邻接矩阵存储的无向图的深度优先遍历 template <typename Type> void Graph<Type>::DFS() { stack<int> iStack; showVertex(0); vertexList[0]->wasVisted = true; iStack.push

图的DFS与BFS遍历

一.图的基本概念 1.邻接点:对于无向图无v1 与v2之间有一条弧,则称v1与v2互为邻接点:对于有向图而言<v1,v2>代表有一条从v1到v2的弧,则称v2为v1的邻接点. 2.度:就是与该顶点相互关联的弧的个数. 3.连通图:无向图的每个顶点之间都有可达路径,则称该无向图为连通图.有向图每个顶点之间都有<v1,v2>和<v2,v1>,则称此有向图为强连通图. 二.存储结构 1.邻接矩阵存储(Adjacency Matrix) 对无权图,顶点之间有弧标1,无弧标0:

图的 DFS 与 BFS 复杂度分析

DFS的复杂度分析: 对于邻接表的存储方式:因为邻接表中每条链表上的从第2个结点到表尾结点一定是表头结点的邻接点,所以遍历表头结点的邻接的过程中只需要遍历这些顶点即可,无需遍历其他的顶点,所以遍历某个顶点的所有邻接点的复杂度为O(ei), ei为每个顶点的邻接点个数,也就是每条链表的边数.所以邻接表版的 dfs 遍历所有邻接点的时间复杂度为 O(e1 + e2 + e3 + .... + en) ,因为所有边数之和为 E , 所以时间复杂度为 O(E) , 又因为访问每个顶点都必须被访问一次,

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

  在学习图结构的过程中,DFS和BFS是两种不同的遍历方式,其寻找元素具有不同的优点和缺陷. BFS被称作广度优先算法, 在遍历整个图的过程中,BFS将采用入队的方式进行,值得一提的是,这和树结构中的层序遍历有很大的相似之处. 在层序遍历中,将父亲节点入队后,在父亲节点出队后,将其儿子节点入队. 同理在图的BFS遍历中,先让BFS的首元素入队,在收元素入队后将他的儿子节点入队,放能够实现BFS搜索,他们的整体思想是一样的. 1 void TraversalGraph_BFS(LGraph Gr

递归,回溯,DFS,BFS的理解和模板【摘】

递归:就是出现这种情况的代码: (或者说是用到了栈) 解答树角度:在dfs遍历一棵解答树 优点:结构简洁缺点:效率低,可能栈溢出 递归的一般结构: 1 void f() { 2 if(符合边界条件) { 3 /////// 4 return; 5 } 6 7 //某种形式的调用 8 f(); 9 } 回溯:递归的一种,或者说是通过递归这种代码结构来实现回溯这个目的.回溯法可以被认为是一个有过剪枝的DFS过程.解答树角度:带回溯的dfs遍历一棵解答树回溯的一般结构: 1 void dfs(int

搜索分析(DFS、BFS、递归、记忆化搜索)

搜索分析(DFS.BFS.递归.记忆化搜索) 1.线性查找 在数组a[]={0,1,2,3,4,5,6,7,8,9,10}中查找1这个元素. (1)普通搜索方法,一个循环从0到10搜索,这里略. (2)递归(从中间向两边) 1 //递归一定要写成记忆化递归 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool vis[11]; 5 int count1=0; 6 7 void search(int n){ 8 count1++; 9

PAT 05-1 List Components (简单DFS与BFS)

刚一拿到这道题把他想的太复杂了 明明是长度最大为十的顺序结构就能解决的问题,竟然优先想到用链表. BFS牵扯到一个队列的操作,在这种小规模数据里面 用顺序结构好很多 题目如下: For a given undirected graph with N vertices and E edges, please list all the connected components by both DFS and BFS. Assume that all the vertices are numbered