• 图的广度优先遍历


    广度优先遍历

    基本思想

    -step1、 从图中某个顶点V0出发,并访问此顶点;

    -step2、 从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依此从W1,W2,…,Wk

    出发访问各自未被访问的邻接点。

    -step3、 重复step2,直到全部顶点都被访问为止。

    性质

    与深度优先遍历类似,广度优先遍历也有许多有用的特性:

    1、广度优先生成树

    在广度优先遍历中,如果将每次“前进”(纵深)路过的(将被访问的)结点和边都记录下来,就得到一个子图,该子图为以出发点为根的树,称为广度优先生成树。这种情况与深度优先遍历类似。

    类似地,也可以给广度优先生成树结点定义时间戳。

    2、最短路径

    显然,从v0出发广度优先遍历图,将得到v0到它的各个可达到的路径。我们这里定义路径上的边的数目为路径长度。与深度优先遍历不同,广度优先遍历得到的v0到各点的路径是最短路径(未考虑边权)。

    2.基本实现思想

    操作方法

    (1)顶点v入队列。

    (2)当队列非空时则继续执行,否则算法结束。

    (3)出队列取得队头顶点v;访问顶点v并标记顶点v已被访问。

    (4)查找顶点v的第一个邻接顶点col。

    (5)若v的邻接顶点col未被访问过的,则col入队列。

    (6)继续查找顶点v的另一个新的邻接顶点col,转到步骤(5)。

            直到顶点v的所有未被访问过的邻接点处理完。转到步骤(2)。

           广度优先遍历图是以顶点v为起始点,由近至远,依次访问和v有路径相通而且路径长度为1,2,……的顶点。为了使“先被访问顶点的邻接点”先于“后被访问顶点的邻接点”被访问,需设置队列存储访问的顶点。

    3.伪代码

    (1)初始化队列Q;visited[n]=0;

    (2)访问顶点v;visited[v]=1;顶点v入队列Q;

    (3) while(队列Q非空)   

                  v=队列Q的对头元素出队;

                  w=顶点v的第一个邻接点;

                 while(w存在) 

                         如果w未访问,则访问顶点w;

                         visited[w]=1;

                         顶点w入队列Q;

                         w=顶点v的下一个邻接点。

    4.代码实现

     1 #include<iostream>
     2 int i,j,n,m,a,b,cur,book[101]={0},e[101][101],que[10001],head=1,tail=1;
     3 int main()
     4 {
     5     scanf("%d%d",&n,&m);
     6     for(i=1;i<=n;i++)
     7         for(j=1;j<=n;j++)
     8             if(i==j) e[i][j]=0; //自己跟自己
     9             else e[i][j]=99999999;//假设所有任意两个不同点的权都是inf
    10     for(i=1;i<=m;i++)
    11     {
    12         scanf("%d%d",&a,&b);//输入边
    13         e[a][b]=1;//这里,设立了一个表用来表示,a和b是有边相连的。
    14         e[b][a]=1;
    15     }
    16     que[tail]=1;//que[1]=1;
    17     tail++;//tail=2
    18     book[1]=1;//设为已走
    19     while(head<tail&&tail<=n)//当队列非空时循环
    20     {
    21         cur=que[head];
    22         for(i=1;i<=n;i++)
    23         {
    24             if(e[cur][i]==1&&book[i]==0)//没有访问过时
    25             {
    26                 que[tail]=i;
    27                 tail++;
    28                 book[i]=1;//表为已访问
    29             }
    30             if(tail>n) break;
    31         }
    32         head++;
    33     }
    34     printf("%d",que[1]);
    35     for(i=2;i<tail;i++) printf(" %d",que[i]);
    36 }
  • 相关阅读:
    记一次数据库查询超时的原因 Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. The statement has been terminated Felix
    RSA 算法流程 Felix
    linux shell 比较文件相同部分comm命令和不同部分diff命令 按行读取 文件
    jekins vue 发布脚本 shell
    android 自动化测试参考资料(待验证)
    centos7 redis安装
    技术比赛之转件存储设计
    YD设计架构
    LS项目相关图形
    关于公司开放平台的初期计划
  • 原文地址:https://www.cnblogs.com/wxjor/p/5608226.html
Copyright © 2020-2023  润新知