图的广度优先/层次 遍历(BFS) c++ 队列实现

  在之前的博文中,介绍了图的深度优先遍历,并分别进行了递归和非递归实现。BFS 无法递归实现,最广泛的实现是利用队列(queue)。这与DFS的栈实现是极其相似的,甚至代码几乎都很少需要改动。从给定的起点节点开始,依次将其邻接节点全部塞入队列,每次访问一个节点时将其pop()出队列,并将其邻接节点也塞入队列。直到队列为空,算法结束。

  代码实现并无太大障碍,c++实现:

 

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 
 5 #define MAX 20
 6 #define START 1
 7 
 8 int visited[MAX];
 9 int map[MAX][MAX];
10 
11 void bfs(int start, int n){
12     queue<int> q;
13     int q_top;
14     cout<<start<<" ";
15     visited[start] = 1;
16     for (int i = 1; i <= n ;i++ ) {
17         if(map[start][i] == 1 && visited[i] == 0){
18             q.push(i);
19             visited[i] = 1;
20         }
21     }
22     while(!q.empty()){
23         q_top = q.front();
24         q.pop();
25         cout<<q_top<<" ";
26         for(int i = 1; i <= n; i++ ){
27             if(map[q_top][i] == 1 && visited[i] == 0){
28                 q.push(i);
29                 visited[i] = 1;
30             }
31         }
32     }
33     
34 }
35 
36 int main(int argc, const char * argv[]) {
37     int num_vex,num_edge,x,y;
38     cout<<"Input number of nodes and edges >> ";
39     cin>>num_vex>>num_edge;
40     for(int i=0;i<MAX;i++){
41         for(int j = 0;j < MAX;j++){
42             map[i][j] = 0;
43         }
44     }
45     for(int i = 1;i <= num_vex;i++){
46         visited[i] = 0;
47     }
48     cout<<"Input edges, "<<num_edge<<" left >> ";
49     for(int i = 1;i <= num_edge;i++){
50         cin>>x>>y;
51         map[x][y] = map[y][x] = 1;
52         cout<<"Input edges, "<<(num_edge-i)<<" left >> ";
53     }
54     bfs(START, num_vex);
55     return 0;
56 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。