图搜索——使用DFS和BFS耗时比较
图测试数据生成代码:
#include<bits/stdc++.h>
using namespace std;
int random(int mod) {
return rand() % mod;
}
int main() {
freopen("gragh2.txt", "w", stdout);
srand(time(NULL));
, m = << ;
int a, b;
printf("%d %d\n", n, m);
; i < m; ++i) {
a = random(n), b = random(n);
)b = ;
)b = n - ;
else if(a == b)++b;
printf("%d %d\n", a, b);
}
;
}
测试代码:
#include<bits/stdc++.h>
using namespace std;
;
int n, m;
vector<int> g[MAXN];
bool vis[MAXN];
void dfs(int s) {
vis[s] = true;
, sz = g[s].size(); i < sz; ++i) {
int adj = g[s][i];
if(!vis[adj])dfs(adj);
}
}
queue<int> que;
void bfs(int s) {
while(!que.empty())que.pop();
vis[s] = true;
que.push(s);
while(!que.empty()) {
int top = que.front();
que.pop();
, sz = g[top].size(); i < sz; ++i) {
int adj = g[top][i];
if(!vis[adj]) {
que.push(adj);
vis[adj] = true;
}
}
}
}
/**
跑dfs时,结果写到result1.txt中。
跑bfs时,结果写到result2.txt中。
*/
int main() {
freopen("gragh2.txt", "r", stdin);
freopen("result1.txt", "w", stdout);
int a, b;
while(~scanf("%d%d", &n, &m)) {
; i < m; ++i) {
scanf("%d%d", &a, &b);
g[a].push_back(b);
g[b].push_back(a);
}
int start, endd;
srand(time(NULL));
; k < ; ++k) {
;
; i < ; ++i) {
memset(vis, , sizeof(vis));
start = clock();
dfs(rand() % n);
endd = clock();
sum += endd - start;
}
printf("%d\n", sum);
}
}
;
}
结果比较:

可以初步得出结论:当点的数量是10W,边数是400W+时,跑10次,每次100个随机起始点,BFS比DFS要快些。因此,搜索图时,如果两者都能用,那就选BFS,因为BFS用了更多的空间来换“递归时保存栈信息“的时间。
图搜索——使用DFS和BFS耗时比较的更多相关文章
- 【数据结构与算法笔记04】对图搜索策略的一些思考(包括DFS和BFS)
图搜索策略 这里的"图搜索策略"应该怎么理解呢? 首先,是"图搜索",所谓图无非就是由节点和边组成的,那么图搜索也就是将这个图中所有的节点和边都访问一遍. 其次 ...
- Clone Graph leetcode java(DFS and BFS 基础)
题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...
- 数据结构(12) -- 图的邻接矩阵的DFS和BFS
//////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
- 在DFS和BFS中一般情况可以不用vis[][]数组标记
开始学dfs 与bfs 时一直喜欢用vis[][]来标记有没有访问过, 现在我觉得没有必要用vis[][]标记了 看代码 用'#'表示墙,'.'表示道路 if(所有情况都满足){ map[i][j]= ...
- 图论中DFS与BFS的区别、用法、详解…
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 图论中DFS与BFS的区别、用法、详解?
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 数据结构基础(21) --DFS与BFS
DFS 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈). //使用邻接矩阵存储的无向图的深度 ...
- dfs和bfs的区别
详见转载博客:https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索 ...
随机推荐
- 怎样绕开QQ通讯录和360的广播中断
http://www.eoeandroid.com/thread-148381-1-1.html 最近在网上搜索怎样绕开QQ通讯录和360的广播中断,在它们之前拿到短信,结果很遗憾没有搜索到什么东西, ...
- 重塑 data.table
在前面的章节中,我们已经学习了如何使用 reshape2 扩展包对 data.frame 进行塑形.其实,data.table 扩展包为 data.table 对象提供了更快更强的 dcast( ) ...
- JNI.ZC_文件(.so/.h)位置
1.我在做 Android 操作串口的时候,使用的是 "android-serialport-api-master.zip",它所带的 .so文件 的位置是 "??\an ...
- linux 环境下 eas console的运行
1)访问 http://<HOST>:19000/easconsole/ 2)然后下载 jnlp 文件. 3)找个jre, 用javaws 运行 jnlp文件
- Java中HashMap 初始化时容量(参数)如何设置合适?
问题引入 注:本文代码源自java 9. 阿里的插件对于初始化HashMap时,调用无参构造方法,提示如下: 那么问题来了,如果已知需要向 map 中 put n次,那么需要设定初始容量为多少? 单纯 ...
- git commit进行代码检查
使用Ant Design Pro提交代码的时候进行代码检查报了很多错 git commit --no-verify -m "commit" 就可以跳过代码检查 或者在项目里新建 ...
- linux系统时间获取方式
Linux 操作系统计算系统时间:主要函数:time localtime gmtime asctime ctime mktime difftime s ...
- mysql中limit的用法详解[数据分页常用]
在我们使用查询语句的时候,经常要返回前几条或者中间某几行的数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT [offset ...
- halcon之屌炸天的变形匹配(1)
在日常工程应用中,我们通常通过halcon的 shape-based matching(形状匹配)进行各种定位, 如以前文章介绍的这样,理解各个参数并灵活应用通常就能得到很好的匹配效果和匹配速度, 当 ...
- 流程设计器jQuery + svg/vml(Demo6 - 增加结点属性及切换)
到目前流程设计器流程结点的拖拽操作已基本完成,接下来就到结点的属性开发了.前面已经开发过流程模板的属性了,结点属性跟模板属性类似,从属性模板定义copy一份,然后按各结点类型进行调整就ok. 1.先来 ...