标签:rand += 保存 src null push for str 生成
图测试数据生成代码:
#include<bits/stdc++.h> using namespace std; int random(int mod) { return rand() % mod; } int main() { freopen("gragh2.txt", "w", stdout); srand(time(NULL)); int n = 100000, m = 1 << 22; int a, b; printf("%d %d\n", n, m); for(int i = 0; i < m; ++i) { a = random(n), b = random(n); if(a == b && a == 0)b = 1; else if(a == b && a == n - 1)b = n - 2; else if(a == b)++b; printf("%d %d\n", a, b); } return 0; }
测试代码:
#include<bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 10; int n, m; vector<int> g[MAXN]; bool vis[MAXN]; void dfs(int s) { vis[s] = true; for(int i = 0, 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(); for(int i = 0, 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)) { for(int i = 0; i < m; ++i) { scanf("%d%d", &a, &b); g[a].push_back(b); g[b].push_back(a); } int start, endd; srand(time(NULL)); for(int k = 0; k < 10; ++k) { int sum = 0; for(int i = 0; i < 100; ++i) { memset(vis, 0, sizeof(vis)); start = clock(); dfs(rand() % n); endd = clock(); sum += endd - start; } printf("%d\n", sum); } } return 0; }
结果比较:
可以初步得出结论:当点的数量是10W,边数是400W+时,跑10次,每次100个随机起始点,BFS比DFS要快些。因此,搜索图时,如果两者都能用,那就选BFS,因为BFS用了更多的空间来换“递归时保存栈信息“的时间。
标签:rand += 保存 src null push for str 生成
原文地址:http://www.cnblogs.com/565261641-fzh/p/7783917.html