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> ...
随机推荐
- 实验吧web-易-FALSE
先审计代码: <?php if (isset($_GET['name']) and isset($_GET['password'])) { if ($_GET['name'] == $_GET[ ...
- MongoDB三-高级操作
复制来自:http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html 今天跟大家分享一下mongodb中比较好玩的知识,主 ...
- java里mongodb复合查询
Query query = new Query();Criteria criteria = Criteria.where("packetTitle").is(redPacketSt ...
- mysql字符类型总结及常用字符函数
常用字符串函数: concat(s1,s2,s3..) 连接s1,s2,...sn为一个字符串 INSERT(str,x,y,instr)将字符串str从x位置开始,y个字符串替换为字符串 ...
- ADFS 4.0 证书更新
ADFS 4.0 证书更新 由于公网证书的过期,需要重新更新ADFS的服务通信证书: 证书要求: 带私钥 PFX格式 更换流程: 证书安装到 证书\计算机\个人,安装后点开证书能看到"你有一 ...
- 两个exe共享内存数据
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- 2)将普通工程变成动态库dll
1)打开那个工程: 2)然后 看属性里面的控制平台:
- SQL基础教程(第2版)第4章 数据更新:4-1 数据的插入(INSERT)
第4章 数据更新:4-1 数据的插入(INSERT) ● 将列名和值用逗号隔开,分别括在()内,这种形式称为清单.● 对表中所有列进行INSERT操作时可以省略表名后的列清单.● 插入NULL时需要在 ...
- Codeforces Round #619 (Div. 2)E思维+二维RMQ
题:https://codeforces.com/contest/1301/problem/E 题意:给个n*m的图形,q个询问,每次询问问询问区间最大的合法logo的面积是多少 分析:由于logo是 ...
- AI 领域与概述
概述 数据分析行业主要的职业发展. 业务:业务分析师.数据产品经理.产品总监 技术:算法师.架构师.研发经理.研发总监 美工:BI工程师 人工智能,是数据分析的子集.人工智能主要包括 语音识别 自然语 ...