图搜索——使用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(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索 ...
随机推荐
- sonar runner的配置
#Configure here general information about the environment, such as SonarQube DB details for example ...
- Hive安装-windows(转载)
1.安装hadoop 2.从maven中下载mysql-connector-java-5.1.26-bin.jar(或其他jar版本)放在hive目录下的lib文件夹 3.配置hive环境变量,HIV ...
- python 读空的json文件
读空的json文件,python2和python3 的错误提示是不一样的 python2: ValueError: No JSON object could be decoded python3: j ...
- python 判断字典是否为空
my_dict = {} if not bool(my_dict): print("Dictionary is empty")
- redis事务和脚本
事务,简单理解就是,一组动作,要么全部执行,要么就全部不执行.从而避免出现数据不一致的情况. redis提供了简单的事务功能,将一组需要的命令放到multi和exec两个命令之间.multi代表事务开 ...
- 网络TCP建立连接为什么需要三次握手而结束要四次
忽然顿悟了,不管三次握手,还是四次握手,这是保证信息来回两个链路可达(也就是信息能从A到B,也能从B到A)的最低要求.-2018-9-17-晚上九点 举个打电话的例子: A : 你好我是A,你听得到我 ...
- ultraedit开发使用技巧
抛开Mybatis和Hibernate这些dao框架,如果维护老项目时或者不得不用sql拼接时,一个几百行的sql光是去掉navicat中查询的注释或者在sql前后加上双引号就已经很费劲,影响开发效率 ...
- 115. Distinct Subsequences *HARD* -- 字符串不连续匹配
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- bzoj3862
题解: 这一道题目和模板有不同的地方就是在于可以修改只有一条边和i相邻 于是我们还要记录与这个点相邻的点有没有改变 代码: #pragma GCC optimize(2) #include<bi ...
- poj3666&&bzoj1592
题解: 和bzoj1367差不多 然后a[i]-i不用加 然后我再另一个地方加了这句话 然后poj ac,bzoj wa poj数据水啊 代码: #include<cstdio> #inc ...