图的bfs遍历

本文基于https://www.cnblogs.com/johnsonstar/p/16645091.html与https://www.oi-wiki.org/

bfs,即广度优先遍历,在搜索方面常用于搜寻最短路,其基本实现方式是通过队列存储节点:将初始节点放入队列,再依次将该节点相邻的节点依次放入队列。遍历完成后就弹出初始节点,周而复始,直到队列为空。

下面给出几种bfs的实现方法(每种方法的图存储方式不同)

直接存边bfs:

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 typedef struct edge{
 5     int u,v;
 6 }edge;
 7 edge e[100];
 8 int vis[100];
 9 int n;//边数
10 void bfs(int m){//bfs起始点 
11     queue<int> q;
12     q.push(m);
13     vis[m]=1;
14     cout<<m<<" ";
15     while(!q.empty()){
16         int u=q.front();
17         q.pop();
18         for (int i=1;i<=n;i++){
19             if (e[i].u==u&&vis[e[i].v]==0){
20                 vis[e[i].v]=1;
21                 q.push(e[i].v);
22                 cout<<e[i].v<<" ";
23             }
24         }
25     }
26 }
27 int main(){
28     cin>>n;
29     for (int i=1;i<=n;i++)
30         cin>>e[i].u>>e[i].v;
31     bfs(1);
32     return 0;
33 } 

邻接矩阵bfs:

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 int adj[100][100];
 5 int k;//点数 
 6 int n;//边数
 7 int vis[100];
 8 void bfs(int m){
 9     queue<int> q;
10     q.push(m);
11     cout<<m<<" ";
12     vis[m]=1;
13     while(!q.empty()){
14         int u=q.front();
15         q.pop();
16         for (int i=1;i<=k;i++){
17             if (adj[u][i]&&!vis[i]){
18                 q.push(i);
19                 cout<<i<<" ";
20                 vis[i]=1;
21             }
22         }
23     }
24 } 
25 int main(){
26     cin>>k>>n;
27     for (int i=1;i<=n;i++){
28         int u,v;
29         cin>>u>>v;
30         adj[u][v]=1;
31         adj[v][u]=1;
32     }
33     bfs(1);
34     return 0;
35 } 

邻接表bfs:

 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 using namespace std;
 5 vector<vector<int> >adj;
 6 int vis[100];
 7 int k;//点数 
 8 int n;//边数
 9 void bfs(int m){
10     queue<int> q;
11     q.push(m);
12     cout<<m<<" ";
13     vis[m]=1;
14     while(!q.empty()){
15         int u=q.front();
16         q.pop();
17         for (int i=0;i<adj[u].size();i++){
18             if (!vis[adj[u][i]]){
19                 cout<<adj[u][i]<<" ";
20                 vis[adj[u][i]]=1;
21                 q.push(adj[u][i]);
22             }
23         }
24     } 
25 }
26 int main(){
27     cin>>k>>n;
28     adj.resize(k+1);
29     for (int i=1;i<=n;i++){
30         int u,v;
31         cin>>u>>v;
32         adj[u].push_back(v);
33         adj[v].push_back(u);
34     }
35     bfs(1);
36     return 0;
37 } 

链式前向星实现:

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 int cnt=0;
 5 int nxt[100];
 6 int head[100];
 7 int to[100];
 8 int vis[100];
 9 int k;
10 int n;
11 void insert(int u,int v){
12     nxt[++cnt]=head[u];
13     head[u]=cnt;
14     to[cnt]=v;
15 }
16 void bfs(int m){
17     queue<int> q;
18     q.push(m);
19     cout<<m<<" ";
20     vis[m]=1;
21     while(!q.empty()){
22         int u=q.front();
23         q.pop();
24         for (int i=head[u];i;i=nxt[i]){
25             if (!vis[to[i]]){
26                 cout<<to[i]<<" ";
27                 q.push(to[i]);
28                 vis[to[i]]=1;
29             }
30         }
31     }
32 }
33 int main(){
34     cin>>k>>n;
35     for (int i=1;i<=n;i++){
36         int u,v;
37         cin>>u>>v;
38         insert(u,v);
39         insert(v,u);
40     }
41     bfs(1);
42     return 0;
43 }
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值