zoukankan      html  css  js  c++  java
  • 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<<"请依次输入各顶点:
    ";
    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("每一行输入一条弧依附的顶点(空格分开):
    ");
    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	",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	",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 }

  • 相关阅读:
    golang学习之旅:官方文档汇总
    golang学习之旅:搭建go语言开发环境
    《编码》读书笔记:从无到有构建计算机系统
    在Eclipse中如何关联spring-framework的文档和源代码
    Java中Unicode的编码和实现
    个人常用工具整理
    battery-historian结果分析
    电量分析工具 Battery Historian 的配置及使用
    appium使用常见问题汇总--持续更新
    appium连接夜神模拟器方法总结
  • 原文地址:https://www.cnblogs.com/xzxl/p/7300529.html
Copyright © 2011-2022 走看看