广度优先搜索算法(英语:Breadth-First Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。
#include <bits/stdc++.h>
using namespace std;
static const int N = 10;
static const int UNDISCOVERED = 0;
static const int DISCOVERED = 1;
static const int VISITED = 2;
static const int INFTY = (1 << 21);
int n, M[N][N];
int status[N];
int d[N];
int firstNbr(int u){
for (int i = 0; i < n; i++){
if (M[u][i] != 0)
return i;
}
return -1;
}
int nextNbr(int u, int v){
for (int i = v+1; i < n; i++){
if (M[u][i] != 0)
return i;
}
return -1;
}
void bfs(int u){
queue<int> q;
for (int i = 0; i < n; i++) status[i] = UNDISCOVERED;
for (int i = 0; i < n; i++) d[i] = INFTY;
q.push(u);
status[u] = DISCOVERED;
d[u] = 0;
while(!q.empty()){
int u = q.front();
q.pop();
for (int v = firstNbr(u); -1 < v; v = nextNbr(u, v)){
if (status[v] == UNDISCOVERED){
q.push(v);
status[v] = DISCOVERED;
d[v] = d[u] + 1;
}
}
status[u] = VISITED;
}
for (int i = 0; i < n; i++){
cout << i+1 << " " << ((d[i] == INFTY)? (-1) : d[i]) << endl;
}
}
int main(){
int u, k, v;
cin >> n;
memset(M, 0, sizeof(M));
for (int i = 0; i < n; i++){
cin >> u >> k;
u--;
for (int j = 0; j < k; j++){
cin >> v;
v--;
M[u][v] = 1;
}
}
bfs(0);
return 0;
}
参考链接:
[1] 维基百科 - 广度优先搜索