DFS-BFS(深搜广搜)原理及C++代码实现
深搜和广搜是图很多算法的基础,很多图的算法都是从这两个算法中启发而来。
深搜简单地说就是直接一搜到底,然后再回溯,再一搜到底,一直如此循环到没有新的结点。
广搜简单地说就是一层一层的搜,像水的波纹一样往外面扩散,扩散到最外层搜索也就完成了。
prim最小生成树、Dijkstra单源最短路径算法都使用了类似广度优先搜索的思想。
拓扑排序就可以用深搜来实现,分解强连通分量也可以用深搜来实现(转置图加两次深搜)
我们实现广搜时需要用队列来辅助我们进行。实现深搜时使用栈来辅助我们进行,所以显而易见的用递归实现深搜也比较合适,因为递归本身就是栈存储。
下面给出的广搜是无向图中,给定源结点的方法。
给出的深搜是有向图中,未给出源结点的方法,且是非递归实现(递归实现相对比较简单)。
代码如下:(仅供参考)
template<typename T>
class Graph {
private :
struct Vertex {
forward_list<T> vertex;
bool color;
};
typedef unordered_map<T, Vertex> adjList;
adjList Adj;
public :
void insertEdge(T x, T y) {Adj[x].vertex.push_front(y);}
void deleteEdge(T x, T y) {Adj[x].vertex.remove(y);}
void BFS(T s);
void DFS();
}; template<typename T>
void Graph<T>::BFS(T s) {
vector<T> que;
for (auto i : Adj)
i.second.color = false;
Adj[s].color = true;
cout << s << ends;
que.insert(que.begin(), s);
while (!que.empty()) {
T u = que.back();
que.pop_back();
for (auto i : Adj[u].vertex)
if (Adj[i].color == false) {
Adj[i].color = true;
cout << i << ends;
que.insert(que.begin(), i);
}
}
} template<typename T>
void Graph<T>::DFS() {
vector<T> stk;
for (auto i : Adj)
i.second.color = false;
for (auto u : Adj)
if (u.second.color == false) {
T v = u.first;
while () {
if (Adj[v].color == false) {
cout << v << ends;
Adj[v].color = true;
}
auto p = Adj[v].vertex.begin();
for ( ; p != Adj[v].vertex.end(); ++p)
if (Adj[*p].color == false) {
stk.push_back(v);
v = *p;
break;
}
if (p == Adj[v].vertex.end() && !stk.empty()) {
v = stk.back();
stk.pop_back();
}
else if (stk.empty()) break;
}
}
}
DFS-BFS(深搜广搜)原理及C++代码实现的更多相关文章
- PTA 7-6 列出连通集(深搜+广搜)
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1 ...
- poj3083 Children of the Candy Corn 深搜+广搜
这道题有深搜和广搜.深搜还有要求,靠左或靠右.下面以靠左为例,可以把简单分为上北,下南,左西,右东四个方向.向东就是横坐标i不变,纵坐标j加1(i与j其实就是下标).其他方向也可以这样确定.通过上一步 ...
- HDU 3666 THE MATRIX PROBLEM (差分约束 深搜 & 广搜)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- NYOJ-58最少步数,广搜思想!
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 -> Link <- 这个题深搜广搜都是可以的,迷宫已经给出了,就看怎么做了:一般起点终点确定用广搜 ...
- HDU 1312 Red and Black (DFS & BFS)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 题目大意:有一间矩形房屋,地上铺了红.黑两种颜色的方形瓷砖.你站在其中一块黑色的瓷砖上,只能向相 ...
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 什么时候用深搜(dfs)什么时候用广搜(bfs)(转)
1.BFS是用来搜索最短径路的解是比较合适的,比如求最少步数的解,最少交换次数的解,因为BFS搜索过程中遇到的解一定是离根最近的,所以遇到一个解,一定就是最优解,此时搜索算法可以终止.这个时候不适宜使 ...
- 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...
- 图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
#include <iostream> #include <stdio.h> #include <cstdlib> #include <cstring> ...
随机推荐
- POJ 3970:Party
Party Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status ...
- delphi内嵌汇编
{ 前面知道了一个汇编的赋值指令(MOV), 再了解一个加法指令(ADD), 就可以做个例子了. 譬如: ADD AX,BX; 这相当于 Delphi 中的 AX := AX + BX; 另外提前来个 ...
- SQL基础教程(第2版)第5章 复杂查询:练习题
/* 下面是解答示例 */ -- 创建视图的语句 CREATE VIEW ViewPractice5_1 AS SELECT product_name, sale_price, regist_date ...
- git高级用法之cheery-pick
前言 想象一种情况,你在分支上开发多个功能,现在要将第一个功能推到另一个分支上 master 1_2 | dev \__3_4_5 例如上面的,先基于master创建了分支dev, 然后提交了3个co ...
- OpenMP笔记(二)
原文:https://www.bearoom.xyz/2019/02/18/openmp2/ OpenMP是由三部分组成的:指令.库函数和环境变量. 一.指令 在C/C++中使用OpenMP需要用到的 ...
- sqlserver2008的sql语句支持的最大长度
想写一个sql语句,很长,主要是in后跟着无数个用户ID,(虽然实现方式很低级,但是还是凑合着用吧) 不知道sql最大长度是多少,看了 SQL Server 的最大容量规范,写的是 包含 SQL 语句 ...
- 计算机utf-8/gbk/utf-16对照表
GBK UTF-16 UTF-8 ==================D2BB 4E00 E4 B8 80 一B6A1 4E01 E4 B8 81 丁C6DF 4E03 E4 B8 ...
- 浅谈JVM - 内存结构(二)- 虚拟机栈|凡酷
2.1 定义 Java Virtual Machine Stacks(Java虚拟机栈) Java 虚拟机栈描述的是 Java 方法执行的内存模型,用于存储栈帧,是线程私有的,生命周期随着线程启动而产 ...
- 在线公开课 | 5G时代的视频云服务关键技术与实践
5G时代来临在即,视频技术将会如何发展呢?基于视频云服务的技术开发又有怎样的变化呢?为此,京东云视频云产品研发部高级总监魏伟为大家做出了详细解读. 魏伟拥有10多年视频行业研发经验,先后从事于AVS标 ...
- cisco3900板卡sm-es3g-24-p使用方法
不知道是不是叫板卡,还是叫线卡希望不予深究.本文摘自:https://zhidao.baidu.com/question/1669814353056144947.html 插上板卡后,在配置界面仅显示 ...