图的遍历(深度优先搜索)

图的遍历(深度优先搜索)1 深度优先搜索遍历过程图的深度优先搜索 DepthFirstSe 和树的先序遍历比较类似 它的思想 假设初始状态是图中所有顶点均未被访问 则从某个顶点 v 出发 首先访问该顶点 然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图 直至图中所有和 v 有路径相通的顶点都被访问到 若此时尚有其他顶点未被访问到 则另选一个未被访问的顶点作起始点 重复上述过程 直至图中所有

1、深度优先搜索遍历过程

图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。

它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

显然,深度优先搜索是一个递归的过程

深度优先遍历特点是,选定一个出发点后进行遍历,能前进则前进,若不能前进,回退一步再前进,或再回退一步后继续前进。依此重复,直到所有与选定点相通的所有顶点都被遍历。

2、示例

对图7-25连通无向图采用深度优先搜索遍历可得到顶点访问序列:v0,v1,v3,v7,v4,v8,v2,v5,v6

对图7-26连通无向图采用深度优先搜索遍历可得到顶点访问序列:v0,v1,v3,v2,v4,v5,v6,v7


图的遍历(深度优先搜索)


对图7-27连通无向图采用深度优先搜索遍历可得到顶点访问序列:v0,v1,v4,v3,v2或v2,v3,v0,v1,v4或v2,v1,v0,v4,v3


图的遍历(深度优先搜索)


3、连通图的深度优先遍历

   给定一图G=

,用visited[i]表示顶点i的访问情况,初值设为0,表示所有顶点未被访问过,当顶点被访问过时置1。则初始情况下所有的visited[i]都为0。假设从顶点V
0开始遍历,则下一个遍历的顶点是V0第一个邻接点Vi,接着遍历Vi第一个邻接点Vj,……直到所有的顶点都被访过。

4、代码

无向图,邻接矩阵存储:

对图7-25深度优先遍历:

#include 
   
     using namespace std; #define INFINITY 65535 /* 表示权值的无穷*/ typedef int EdgeType;//边上的权值类型 typedef int VertexType;//顶点类型 const int MaxSize=100; int visited[MaxSize];//全局标识数组 class MGraph//邻接矩阵类 { public: MGraph(){vertexNum=0;edgeNum=0;} MGraph(VertexType a[],int n);//构造函数,初始化具有n个顶点的零图 void CreateMGraph1(MGraph *Gp);//建立无向图的邻接矩阵 void DFS(int v);//从v出发深度优先遍历的递归函数 void DFS1(int v);//从v出发深度优先遍历的非递归函数 public: int vertexNum,edgeNum;//顶点数和边数 EdgeType adj[MaxSize][MaxSize];//邻接矩阵 VertexType vertex[MaxSize];//顶点表 }; //构造函数,初始化具有n个顶点的零图 MGraph::MGraph(VertexType a[],int n) { vertexNum=n;edgeNum=0; for(int i=0;i 
    
      > Gp->vertexNum >> Gp->edgeNum; cout << "请输入顶点信息(空格分隔):" << endl; for (i = 0; i < Gp->vertexNum; i++) cin >> Gp->vertex[i]; for (i = 0; i < Gp->vertexNum; i++) { for (j = 0; j < Gp->vertexNum; j++) Gp->adj[i][j] = 0; } for (k = 0; k < Gp->edgeNum; k++) { cout << "请输入边(vi, vj)的上标i,下标j(空格分隔):" << endl; cin >> i >> j; Gp->adj[i][j] = 1; Gp->adj[j][i] = 1;// 因为是无向图,矩阵对称 } } //从v出发深度优先遍历的递归函数 void MGraph::DFS(int v) { int n=vertexNum;//顶点数目 if(v<0||v>=n) throw "位置出错"; cout< 
     
       =n) throw "位置出错"; cout< 
       
      
     
   

图的遍历(深度优先搜索)





无向图,邻接表存储:

图7-25:

#include       using namespace std; #define INFINITY 65535 /* 表示权值的无穷*/ typedef int EdgeType;//边上的权值类型 typedef int VertexType;//顶点类型 const int MaxSize=100; int visited[MaxSize];//全局标识数组 //无向图邻接表。边表结点结构 struct EdgeNode { int adjvex;//邻接点域 EdgeNode *next;//指向下一个边结点的指针 }; //无向图邻接表。表头结点结构 struct VexNode { VertexType vertex;//顶点 EdgeNode *firstedge;//边表的头指针 }; //邻接表类 class ALGraph { public: ALGraph()//无参构造函数 { vertexNum=0; edgeNum=0; for(int i=0;i         adjvex=end;//邻接点 //p->weight=weight; p->next=adjlist[start].firstedge;//前插法插入边结点p adjlist[start].firstedge=p; } //打印存储的图 void ALGraph::displayGraph(int nodeNum) { int i,j; EdgeNode *p; for(i=0;i           adjvex<<')'<             next; } } } //从v出发深度优先遍历可达顶点递归函数 void ALGraph::DFSL(int v) { int n=vertexNum; int j; EdgeNode *p; if(v>=n||v<0) throw "位置出错"; cout<               adjvex;//顶点 if(visited[j]==0) DFSL(j); p=p->next; } } //从v出发深度优先遍历可达顶点的非递归函数 void ALGraph::DFSL1(int v) { int S[MaxSize],top=-1,j,n=vertexNum; EdgeNode *p; if(v>=n||v<0) throw "位置出错"; cout<                 adjvex;//顶点 if(visited[j]==1) p=p->next; else { cout<                                          

图的遍历(深度优先搜索)









版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218770.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:31
下一篇 2026年3月17日 下午11:32


相关推荐

  • SpringBoot打包war

    SpringBoot打包warSpringBoot 打包 war 一 修改 pom 配置 1 将打包方式修改为 war packaging war packaging 2 排除 springboot 内置 tomcat dependency groupId org springframew boot groupId artifactId spring boot starter web artifactId 排除内置容器 dependency

    2026年3月17日
    2
  • 手机上有哪些不错的c语言编程软件?[通俗易懂]

    手机上有哪些不错的c语言编程软件?[通俗易懂]手机上编程C语言的软件其实非常多,下面我介绍2个不错的软件,分别是C语言编译器和C++编译器,这2个软件都可以在手机上直接编译运行C语言程序,而且使用起来非常不错,下面我简单介绍一下这2个软件的安装和使用:C语言编译器1.首先,下载安装C语言编译器,这个可以直接到手机应用商店中搜索,如下,大概也就13兆左右:2.安装完成后,打卡这个软件,就可以直接新建C语言文件,进…

    2025年9月6日
    6
  • MVC与三层架构理解

    MVC与三层架构理解1.JSP的发展2.MVC思想优缺点3.三层架构为什么使用三层三层优缺点4.MVC与三层架构的区别

    2022年6月25日
    29
  • linux抓包怎么查看数据包_shell curl获取返回数据

    linux抓包怎么查看数据包_shell curl获取返回数据(1)想要截获所有210.27.48.1的主机收到的和发出的所有的分组:#tcpdumphost210.27.48.1(2)想要截获主机210.27.48.1和主机210.27.48.2或210.27.48.3的通信,使用命令(注意:括号前的反斜杠是必须的):#tcpdumphost210.27.48.1and(210.27.48.2or210.27.48.3)(3)如…

    2022年10月14日
    7
  • malloc函数实现过程

    malloc函数实现过程在C语言中,要进行动态内存的开辟就需要使用到malloc函数,在C++中使用的new关键字的基层也是调用了malloc函数,可见malloc函数的重要性,这个就浅析一下malloc的实现过程。本文的测试环境是win10+vs2015。首先先看看malloc函数怎么去调用//malloc函数原型//void*malloc(size_tsize);//(MSDN中的定义)type

    2022年5月7日
    54
  • gtest测试框架使用详解_quartus在线调试教程

    gtest测试框架使用详解_quartus在线调试教程编辑推荐:本文来自51CTO,本文主要简单介绍了googletest代码的环境配置以及简单实用过程,希望对您的学习有所帮助。1、下载googletest代码得到压缩包:解压并进入msvc文件夹:googletest-master\googletest\msvc2、打开gtest.sln文件因为我的VS是2017版,下载的gtest对应的是2010版,所以打开会提示选择目标SDK版本和升级平台工具集…

    2026年4月18日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号