BFS实现模板

以如下图的无向图G4为例,进行图的深度优先搜索:

假设从顶点v1出发进行搜索,首先访问v1和v1的邻接点v2和v3,然后依次访问v2的邻接点v4和v5及v3的邻接点v6和v7,最后访问v4的邻接点v8。由于这些顶点的邻接点均已被访问,并且图中所有顶点都被访问,由些完成了图的遍历。得到的顶点访问序列为:

代码:

 1 /*    图的BFS遍历    */
 2 //邻接矩阵形式实现 
 3 //顶点从1开始 
 4 #include<iostream>
 5 #include<cstdio>
 6 #include<queue>
 7 using namespace std;
 8 const int maxn = 105;        //最大顶点数 
 9 typedef int VertexType;     //顶点类型
10 bool vis[maxn];  
11 
12 struct Graph{               //邻接矩阵表示的图结构
13     VertexType vex[maxn];   //存储顶点
14     int arc[maxn][maxn];    //邻接矩阵
15     int vexnum,arcnum;      //图的当前顶点数和弧数
16 };
17 
18 void createGraph(Graph &g)  //构建有向网g
19 {
20     cout<<"请输入顶点数和边数:";
21     cin>>g.vexnum>>g.arcnum;
22      
23     //构造顶点向量
24     cout<<"请依次输入各顶点:\n";
25     for(int i=1;i<=g.vexnum;i++){
26         scanf("%d",&g.vex[i]);
27     }
28      
29     //初始化邻接矩阵
30     for(int i=1;i<=g.vexnum;i++){
31         for(int j=1;j<=g.vexnum;j++){
32             g.arc[i][j] = 0;
33         }
34     }
35      
36     //构造邻接矩阵
37     VertexType u,v;     //分别是一条弧的弧尾(起点)和弧头(终点)
38     printf("每一行输入一条弧依附的顶点(空格分开):\n");
39     for(int i=1;i<=g.arcnum;i++){
40         cin>>u>>v;
41         g.arc[u][v] = g.arc[v][u] = 1; 
42     }  
43 }
44 
45 //邻接矩阵的宽度遍历操作
46 void BFSTraverse(Graph g)
47 {
48     queue<int> q;                        //声明队列q 
49     for(int i=1;i<=g.vexnum;i++){
50         vis[i] = false;
51     }
52     for(int i=1;i<=g.vexnum;i++){        //对每个顶点做循环 
53         if(!vis[i]){
54             vis[i] = true;
55             printf("%d\t",g.vex[i]);
56             q.push(i);                    //将此节点入队列 
57             while(!q.empty()){
58                 int m = q.front();
59                 q.pop();                //出队列,值已赋给m 
60                 for(int j=1;j<=g.vexnum;j++){
61                     if(g.arc[m][j]==1 && !vis[j]){        //如果顶点j是顶点i的未访问的邻接点
62                         vis[j] = true;
63                         printf("%d\t",g.vex[j]);
64                         q.push(j);                        //将顶点j入队列 
65                     }
66                 }
67                 
68             }
69         }
70     }
71     
72 } 
73 
74 int main()
75 {
76     Graph g;
77     createGraph(g);
78     BFSTraverse(g);
79     return 0;
80 }

posted @ 2017-08-07 18:08  GGBeng  阅读(775)  评论(0编辑  收藏  举报