DFS-BFS(深搜广搜)原理及C++代码实现

深搜和广搜是图很多算法的基础,很多图的算法都是从这两个算法中启发而来。

深搜简单地说就是直接一搜到底,然后再回溯,再一搜到底,一直如此循环到没有新的结点。

广搜简单地说就是一层一层的搜,像水的波纹一样往外面扩散,扩散到最外层搜索也就完成了。

prim最小生成树、Dijkstra单源最短路径算法都使用了类似广度优先搜索的思想。

拓扑排序就可以用深搜来实现,分解强连通分量也可以用深搜来实现(转置图加两次深搜)

我们实现广搜时需要用队列来辅助我们进行。实现深搜时使用栈来辅助我们进行,所以显而易见的用递归实现深搜也比较合适,因为递归本身就是栈存储。

下面给出的广搜是无向图中,给定源结点的方法。

给出的深搜是有向图中,未给出源结点的方法,且是非递归实现(递归实现相对比较简单)。

代码如下:(仅供参考)

 1 template<typename T>
 2 class Graph {
 3 private :
 4     struct Vertex {
 5         forward_list<T> vertex;
 6         bool color;
 7     };
 8     typedef unordered_map<T, Vertex> adjList;
 9     adjList Adj;
10 public :
11     void insertEdge(T x, T y) {Adj[x].vertex.push_front(y);}
12     void deleteEdge(T x, T y) {Adj[x].vertex.remove(y);}
13     void BFS(T s);
14     void DFS();
15 };
16
17 template<typename T>
18 void Graph<T>::BFS(T s) {
19     vector<T> que;
20     for (auto i : Adj)
21         i.second.color = false;
22     Adj[s].color = true;
23     cout << s << ends;
24     que.insert(que.begin(), s);
25     while (!que.empty()) {
26         T u = que.back();
27         que.pop_back();
28         for (auto i : Adj[u].vertex)
29             if (Adj[i].color == false) {
30                 Adj[i].color = true;
31                 cout << i << ends;
32                 que.insert(que.begin(), i);
33             }
34     }
35 }
36
37 template<typename T>
38 void Graph<T>::DFS() {
39     vector<T> stk;
40     for (auto i : Adj)
41         i.second.color = false;
42     for (auto u : Adj)
43         if (u.second.color == false) {
44             T v = u.first;
45             while (1) {
46                 if (Adj[v].color == false) {
47                     cout << v << ends;
48                     Adj[v].color = true;
49                 }
50                 auto p = Adj[v].vertex.begin();
51                 for ( ; p != Adj[v].vertex.end(); ++p)
52                     if (Adj[*p].color == false) {
53                         stk.push_back(v);
54                         v = *p;
55                         break;
56                     }
57                 if (p == Adj[v].vertex.end() && !stk.empty()) {
58                     v = stk.back();
59                     stk.pop_back();
60                 }
61                 else if (stk.empty()) break;
62             }
63         }
64 }

原文地址:https://www.cnblogs.com/yxsrt/p/12249928.html

时间: 2024-08-29 13:46:32

DFS-BFS(深搜广搜)原理及C++代码实现的相关文章

HDU 4771 Stealing Harry Potter&#39;s Precious (深搜+广搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题面: 欢迎参加--BestCoder周年纪念赛(高质量题目+多重奖励) Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2207    Accepted Submis

leetcode 深搜广搜

遍历整个grid数组,当发现有1的时候,就把和这个1连成片的1都置为0,并增加一个计数.最后返回这个计数. 广搜,但这个代码通不过测试,栈溢出. class Solution { public: void bfs(vector<vector<char>>& grid,int i,int j){ if(i<0||j<0||i>=grid.size()||j>=grid[0].size()) return; if(grid[i][j]=='0') ret

迷宫问题(深搜 广搜)

题目描述: 给出一个m*n的迷宫图和一个入口,一个出口. 编一个程序,打印一条从迷宫入口到出口的路径. -1表示走不通,0表示能走,只能上下左右走: 无路可走输出"no way": 样例输入: 8 5-1 -1 -1 -1 -1 0 0 0 0 -1-1 -1 -1 0 -1-1 0 0 0 -1-1 0 0 1 -1-1 0 0 0 -1-1 -1 -1 0 -1-1 0 0 0 -12 18 4 8 5-1 -1 -1 -1 -10 0 0 0 -1-1 -1 -1 0 -1-1

7.23 深搜广搜

深搜(DFS)  关键词:回溯 栈实现,(递归本质和栈一样)一直走到底再回溯,时间复杂度高,空间低 #include<iostream> #include<cstring> using namespace std; int R,C; char maps[40][40]; int dp[40][40]; int dir[2][4]={{1,0,0,-1},{0,1,-1,0}}; int ans=1<<30; void DFS(int x,int y,int step){

图的创建,深搜,广搜(基于临接表实现)

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <queue> using namespace std; #define MaxVertexNum 100 //最大顶点数 typedef enum{DG,UDG,DN,UDN} GraphKind; //图的种类 typedef int InfoType; typedef char VertexType; typedef

深搜,广搜

//实验要求: //用邻接表存储一个无向图, //深度优先,广度优先遍历 //拓扑排序 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int status ; struct ljno //邻接表数据类型 { int x; //存储数据 ljno* next; }ss; struct ALGraph { ljno *data ; int vexnum,exnum;//顶点个数和边的个数 };

965. 单值二叉树(深搜/广搜)

1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 private int val; 12 private boolean flag=true; 13 public b

洛谷 P1032 字串变换 广搜

这道题原本我用深搜,结果会T,wcnm,然后就直接参考抄题解了 1 Const maxn=10000; 2 maxq=100000; 3 Var a:array[0..1,0..maxn]of string;//变换规则 4 q:array[0..1,0..maxq]of string;//两个队列 5 step:array[0..1,0..maxn]of longint;//步数 6 head,tail:array[0..1]of longint;//两个队列的头指针和尾指针 7 int,ai

迷宫广搜

上学期学了C,这学期学C++.感觉最难的还是算法,上周作业的一道广搜题是我第一次接触广搜,由于第一学期刚学编程就接触的太多的算法难题,不禁对代码产生畏惧,不过还好没有放弃,虽然算法很难,但我慢慢找到了一点学数学时的乐趣.先介绍一下这道未来的我看过来会觉得很简单一道题吧 You are provided a maze(迷宫), and you need to program to find the least steps to walk from the start to the end.And