以下是基于图的链表表示的:
dfs和bfs的演示:(具体见《算法导论》)
[深搜](http://sjjg.js.zwu.edu.cn/SFXX/sf1/gdyxbl.html)
[广搜](http://sjjg.js.zwu.edu.cn/SFXX/sf1/sdyxbl.html)
bfs通过检测边发现点,被发现点(但未探索)入队。(被探索是指是否检测过与该点相关联的临近顶点)一个顶点被完全探索当且仅当他的所有边被检测。一个顶点探索完选另一个顶点,被选点应位于被发现但未被探索点队列的队首。待探索点集为空时算法结束。(bfs探索顺序与发现顺序一致,dfs发现后马上探索)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #include <iostream> #include <cstdio> #include <list> #include <vector> #include <queue> using namespace std; int n; vector< list<int> > graph; bool visited[100] = {0}; void dfs(int v) { list<int>::iterator it; visited[v] = true; printf("%5d", v); for (it = graph[v].begin(); it != graph[v].end(); ++it) if (!visited[*it]) dfs(*it); } void bfs(int v) { list<int>::iterator it; printf("%5d", v); visited[v] = true; queue<int> t; t.push(v); while (!t.empty()) { v = t.front(); t.pop(); for (it = graph[v].begin(); it != graph[v].end(); ++it) if (!visited[*it]) { printf("%5d", *it); t.push(*it); visited[*it] = true; } } cout << endl; } int main() { //freopen("in.txt", "r", stdin); cout << "input the vertex num:"<< endl; cin >> n; vector< list<int> >::iterator it; for (int i = 0; i < n; ++i) { list<int> il; int t; while (cin >> t && t != n) il.push_back(t); graph.push_back(il); } cout << "result for bfs:" << endl; bfs(0); memset(visited, 0, sizeof(visited)); //重新初始化标志数组 cout << "result for dfs:" << endl; dfs(0); system("pause"); return 0; }
|
按照链表表示输入以下数据:
8
0 1 2 8
1 0 3 4 8
2 0 5 6 8
3 1 7 8
4 1 7 8
5 2 7 8
6 2 7 8
7 3 4 5 6 8
最后一个8用来标识这个节点输入结束。可以得到深搜和广搜的结果。