从深度优先和广度优先两个角度解决同一个问题

题目
从一号顶点开始遍历这个图,使用深度优先搜索和广度优先搜索的2种遍历结果

深度优先遍历的主要思想就是,首先以一个未被访问过的顶点作为起始顶点,沿着当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。这一过程用二维数组E来存储,如下:

上图二维数组中第i行第J列表示的就是顶点i到J是否有边,正无穷表示没有边,1表示有边,这里我们将自己到自己(即i等于j)设为0。我们将这种存储图的方法称为图的邻接矩阵存储法。我们发现这个二维数组是沿主对角线对称的,因为上面这个图是无向图,所谓无向图指的是图的边没有方向,例如边1-5表示1号顶点可以到5号顶点,5号顶点也可以到1号顶点。
下面上代码!

#include<stdio.h>
int book[101],sum,n,E[101][101];
void dfs(int cur)//cur是当前所在的顶点编号
{int i;printf("%d",cur);sum++;//每访问一个顶点,sum就加一if(sum==n) return ;//所有的顶点都已经访问过则直接退出for(i=1;i<=n;i++)//从1号顶点到n号顶点依次尝试,看哪些顶点与当前顶点cur有边相连{//判断当前顶点cur到顶点i是否有边,并判断顶点i是否已经访问过if(E[cur][i]==1&&book[i]==0){book[i]=1;//标记顶点i已经访问过dfs(i);//从顶点i再出发继续遍历}}return;
}
int main()
{int i,j,m,a,b;scanf("$d %d",&n,&m);//初始化二维数组for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(i==j) E[i][j]=0;else E[i][j]=9999999;//我们这里假设9999999为正无穷//读入顶点之间的边for(i=1;i<=m;i++){scanf("%d %d",&a,&b);E[a][b]=1;E[b][a]=1;//这里是无向图}//从一号顶点出发book[1]=1;//标记1号顶点已访问dfs(1);//从一号顶点开始遍历getchar();getchar();return 0;
}

在上面的代码中变量cur存储的是当前正在遍历的顶点,二维数组E存储
的就是图的 边(邻接矩阵),数组book用来记录哪些顶点已经访问过,变量sum用来记录已经访问过多少的顶点,变量n存储的图的顶点的总个数。
可以输入以下数据进行验证:
5 5
1 2
1 3
1 5
2 4
3 5
运行结果是:
1 2 4 3 5

广度优先遍历的主要思想是首先以一个未被访问过的顶点作为起始点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的顶点,直到所有顶点都被访问过,遍历结束。
比如从1号顶点为起点,将1号放入队列中,然后将与1号顶点相邻的未被访问过的顶点即2号、3号和5号顶点依次再放入队列中,如下图:

接下来再将2号顶点相邻的未被访问过的顶点与4号顶点放入到队列中,到此所有顶点都被访问过,遍历结束。如下图:

#include<stdio.h>
int main()
{   int i,j,m,n,a,b,cur book[101]={0},E[101][101];int que[10001],head,tail;sccanf("%d %d",&n,&m);//初始化二维矩阵for (i=1;i<=n;i++)for(j=1;j<=n;j++)if(i==j) E[i][j]=0;else E[i][j]=9999999999;//读入顶点之间的边for(i=1;i<=m;i++){scanf("%d %d",&a,&b);E[a][b]=1;E[a][b]=1;}//队列初始化head=1;tail=1;//从1号顶点出发,将1号顶点加入队列que[tail]=1;tail++;book[1]=1;//标记1号顶点已访问//当队列不为空的时候循环while(head<tail&&tail<=n){cur=que[head];//当前正在访问的顶点编号for(i=1;i<=n;i++)//从1~n依次尝试{//判断从顶点cur到顶点i是否有边,并判断顶点i是否已经访问过if(E[cur][i]==1&&book[i]==0){que[tail]=i;tail++;book[i]=1;}}head++;//head++之后才能继续往下扩展}
for(i=1;i<tail;i++)printf("%d",que[i]);getchar();getchar();return 0;}

可以输入与上面相同的数据进行验证,不过遍历输出的结果是不同的。
运行结果为:
1 2 3 5 4
好啦!有感觉到2种的区别了嘛!
大家赶紧找题目去练习吧!

深度优先与广度优先的区别!相关推荐

  1. 总结深度优先与广度优先的区别

    1.区别 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列. 2) 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要 ...

  2. 深度优先和广度优先的区别 笔记

    深度优先搜索与广度优先搜索的本质区别 这是知乎上的一篇文章,讲的通俗易懂,尤其针对常用的路径规划算法,A*,Dijkstra算法,蚁群算法有一定了解的同学. 简单的说路径规划和树归根到底都是图论,图就 ...

  3. 【数据结构】深度优先和广度优先比较

    深度优先和广度优先比较 区别: 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列. 2) 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每 ...

  4. 深度优先和广度优先的理解

    本段话转自百度知道一个网友的回答,因为回答的实在是太通俗到位了,所以就贴过来了. 问题如下: 深度优先和广度优先的区别.用法. 回答如下: 首先要理解搜索步,一个完整的搜索步包括两个处理  a) 获得 ...

  5. 图的基础知识及深度优先、广度优先算法

    图是一种可以表达复杂结构化信息的基本结构,关于图的例子可以自行百度.首先统一一下图中组成部分的叫法,这里把图中包含的元素叫做顶点,两两元素之间的关系叫做边.有时图中的边会带有更多的信息,比如边的方向, ...

  6. 深度优先和广度优先区别

    (一)深度优先搜索的特点是: 1.深度优先搜索法有递归以及非递归两种设计方法.一般的,当搜索深度较小.问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂.当数据量较大时,由于系统堆 ...

  7. 深度优先和广度优先算法(例题)

    在LeetCode上面刷题刷到一道二叉树的题,这道题我认为对学习树的深度优先和广度优先算法有一定的帮助,先来看一下题 这道题是这样的: 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返 ...

  8. C++深度优先和广度优先的实现

    C++深度优先和广度优先的实现 前言 源码如下: 测试结果 深度优先(栈实现)和广度优先(队列实现)图解 前言 本篇文章为笔者的读书笔记,未经允许请勿转载.如果对你有帮助记得点个赞(●'◡'●) 本文 ...

  9. 树遍历(深度优先和广度优先)

    目录 深度优先 先序遍历 后序遍历 广度优先 对于树结构的遍历一般有深度优先和广度优先 广度优先和深度优先的概念很简单,区别如下: 深度优先,访问完一颗子树再去访问后面的子树,而访问子树的时候,先访问 ...

最新文章

  1. mysql降低数据库版本_三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQ...
  2. 工业物联网的应用领域和方向
  3. leetcode141 环形链表
  4. CentOS 7.4 Tengine安装配置详解(七)
  5. 【转】Retrofit
  6. 3.1等待和通知API(Wait-and-Notify API Tour)
  7. 一张图了解js运算符优先级
  8. Java面试题总结(一)
  9. 深度置信网络基础知识及程序代码
  10. 苹果计算机恢复计算器,苹果自带计算器删除怎么恢復
  11. 计算机体系结构基础2(究竟什么是冯诺依曼瓶颈(von Neumann Bottleneck)?)
  12. APP创意IDEA记录
  13. windows安装OHS(weblogic管理)
  14. win10系统无法访问ftp服务器地址,win10系统访问不了ftp的解决教程
  15. android:foreground
  16. 中国城市码cityCode映射
  17. Android记录15--关于ListView中adapter调用notifyDataSetChanged无效的原因
  18. laravel validate 验证器
  19. 37岁主管被裁,无奈降薪去小公司遭群嘲:许多人早就破产了,只是活在还没倒闭的公司里!...
  20. 高职信息安全比赛攻防思路_2016广东省“中星杯”网络信息安全攻防大赛决赛回顾(2.0多图版)...

热门文章

  1. Ubuntu 怎么在 Libreoffice 中添加字体
  2. Vulkan的基本概念:如何使用Vulkan绘制三角形?
  3. 机器学习基础:模型评估(下)
  4. 你拒绝的,也许是改变你最佳的机会
  5. 基于Python文本内容/情感的对微博文本自动二元分类
  6. User Diverse Preference Modeling by Multimodal Attentive Metric Learning
  7. Manjaro手动调节屏幕亮度
  8. jQuery之属性操作
  9. CentOS 与 Ubuntu:哪个更适合做服务器
  10. Javascript的mouseover和mouseenter的区别