图的广度优先遍历(bfs)

广度优先遍历:

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 */

猜你喜欢

转载自www.cnblogs.com/mr-wei977955490/p/12620789.html