您的位置:首页 > 其它

图的广度优先遍历(bfs)

2020-04-26 19:07 1271 查看

广度优先遍历:

1.将起点s 放入队列Q(访问)

2.只要Q不为空,就循环执行下列处理

(1)从Q取出顶点u 进行访问(访问结束)

(2)将与u 相邻的未访问顶点v 放入Q, 同时将d[v]更新为d[u] + 1

 

主要变量

M

邻接矩阵,如果存在顶点i到顶点j 的边,则M[i][j] 为true
Queue Q 记录下一个待访问顶点的队列
d

将起点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

;
9 int d
;//用来存储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 */

 

  • 点赞
  • 收藏
  • 分享
  • 文章举报
Mrwei_418 发布了19 篇原创文章 · 获赞 2 · 访问量 221 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: