@Author: 张海拔
@Update: 2014-01-11
@Link: http://www.cnblogs.com/zhanghaiba/p/3514489.html
/* *Author: ZhangHaiba *Date: 2014-1-10 * *classcical DFS & BFS */ #include <iostream> #include <cstring> #include <queue> using namespace std; const int N = 512; int mat[N][N]; int vis[N]; void set_mat(int n) { int i, j; for (i = 0; i < n; ++i) for (j = 0; j < n; ++j) cin >> mat[i][j]; } //for connected graph void DFS(int n, int i) { vis[i] = 1; cout << i << " "; for (int j = 0; j < n; ++j) if (!vis[j] && mat[i][j] > 0) DFS(n, j); } queue<int> q; //for connected graph void BFS(int n, int i) { vis[i] = 1; q.push(i); while (!q.empty()) { for (int j = 0; j < n; ++j) if (!vis[j] && mat[q.front()][j] > 0) { vis[j] = 1; q.push(j); } cout << q.front() << " "; q.pop(); } } int main() { int n; cin >> n; set_mat(n); memset(vis, 0, sizeof vis); BFS(n, 0); memset(vis, 0, sizeof vis); DFS(n, 0); return 0; }
测试用例
输入:
7
0 7 0 5 0 0 0
7 0 8 9 7 0 0
0 8 0 0 5 0 0
5 9 0 0 15 6 0
0 7 5 15 0 8 9
0 0 0 6 8 0 11
0 0 0 0 9 11 0
输出:
0 1 2 4 3 5 6
0 1 3 2 4 5 6
DFS:
如果有多个点可以去,选择去第一个点,此时又回到原问题。如果没有点可以去,则回到上一站点,选择去第二个点,一直回到起点为止。
可以看出,DFS有前进的过程,也有回溯的过程,每个点都会前后访问两次。
BFS:
类似树的层次遍历。link(public)