广度优先遍历:
1.将起点s 放入队列Q(访问)
2.只要Q不为空,就循环执行下列处理
(1)从Q取出顶点u 进行访问(访问结束)
(2)将与u 相邻的未访问顶点v 放入Q, 同时将d[v]更新为d[u] + 1
主要变量
M[n][n] | 邻接矩阵,如果存在顶点i到顶点j 的边,则M[i][j] 为true |
Queue Q | 记录下一个待访问顶点的队列 |
d[n] | 将起点s 到个顶点i的最短距离记录在d[i]中。 s无法到达i 时d[i] 为INFTY(极大值) |
1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 5 static const int N = 100; 6 static const int INFTY = (1 << 21); 7 8 int n, M[N][N]; 9 int d[N];//用来存储v到起始顶点的距离 10 11 void bfs(int s) { 12 queue <int> q; 13 q.push(s);//起始顶点 入队 14 //设置初始值, 通过判断距离大小来明白该顶点是否被访问 15 for(int i = 0; i < n; i++) d[i] = INFTY; 16 d[s] = 0;//初始值为0 17 int u; 18 while( !q.empty() ) { 19 u = q.front(); 20 q.pop(); 21 //检索与该顶点有连接的顶点,并入队 22 for(int v = 0; v < n; v++) { 23 if(M[u][v] = 0) continue; 24 //如果该顶点被访问过 25 if(d[v] != INFTY) continue; 26 //该顶点与起始顶点的距离等于,上一个顶点与起始顶点距离加1 27 d[v] = d[u] + 1; 28 q.push(v); 29 } 30 } 31 //输出,若未被访问则输出-1 32 for(int i = 0; i < n; i++) { 33 cout << i + 1 << " " << ( (d[i] == INFTY) ? (-1) : d[i] ) << endl; 34 } 35 } 36 37 int main() { 38 int u, k, v; 39 cin >> n; 40 //初始化 41 for(int i = 0; i < n; i++) { 42 for(int j = 0; j < n; j++) 43 M[i][j] = 0; 44 } 45 //输入数据构建邻接矩阵 46 for(int i = 0; i < n; i++) { 47 cin >> u >> k; 48 u--; 49 for(int j = 0; j < k; j++) { 50 cin >> v; 51 v--; 52 M[u][v] = 1; 53 } 54 } 55 //广度优先遍历 56 bfs(0); 57 58 return 0; 59 } 60 61 /* 62 4 63 1 2 2 4 64 2 1 4 65 3 0 66 4 1 3 67 */