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 }