深度优先遍历无向图

C++构造无向图,邻接矩阵,深度优先遍历,广度优先遍历 define MVNum 100 //最大顶点数//定义无向图邻接矩阵{//顶点表//邻接矩阵//图的当前定点数和边数}; 阅读详情

1.深度优先遍历无向图

无向图是图论中的一个基本概念,其中任意两个顶点之间都存在一条无向边。深度优先遍历(Depth-First Search, DFS)是一种用于遍历或搜索无向图的算法。DFS从图的某一顶点出发,访问尽可能深的分支,直到该分支的所有顶点都被访问过,然后回溯到上一个顶点,继续搜索下一个分支。这种遍历方式在图的连通性判断、寻找环、拓扑排序等问题中有着广泛的应用。

2.深度优先遍历的基本原理

深度优先遍历是一种递归的遍历算法。在遍历过程中,我们使用一个标记数组来记录每个顶点的访问状态。当访问一个顶点时,我们将其标记为已访问,并递归地访问它的所有未访问过的相邻顶点。当所有相邻顶点都被访问过后,我们回溯到上一个顶点,继续搜索其他未访问过的分支。

3.深度优先遍历无向图的步骤

  1. 初始化

    • 创建一个无向图,表示顶点和边的关系。
    • 初始化一个标记数组,用于记录每个顶点的访问状态。所有顶点初始时都标记为未访问。
    • 选择一个起始顶点作为遍历的起点。
  2. 开始遍历

    • 调用深度优先遍历函数,传入起始顶点作为参数。
  3. 深度优先遍历函数

    • 检查当前顶点是否已访问过。如果是,则直接返回。
    • 标记当前顶点为已访问。
    • 遍历当前顶点的所有相邻顶点。对于每个未访问过的相邻顶点,递归调用深度优先遍历函数。
    • 遍历完成后,返回上一层递归。
  4. 输出结果

    • 当所有顶点都被访问过后,遍历结束。可以根据需要输出遍历的顺序或其他相关信息。

4.深度优先遍历无向图的实现

#include<iostream>
#define MAX 100
using namespace std;
int book[MAX+1],n,sum=0,e[MAX+1][MAX+1];
void dfs(int cur){
    cout<<cur<<" ";
    sum++;
    if (sum==n)return;
    for (int i = 0; i <=n; i++)
    {
        if (e[cur][i]==1&&book[i]==0)
        {
            book[i] = 1;
            dfs(i);
        }
    }
    return;
}

int main(){
    int m;
    cin>>n>>m;//元素个数和边数
    for (int i = 1; i <=n; i++)
        for (int j = 1; i <=n; i++)
        {
            if(i==j)e[i][j]=0;
            else e[i][j]=9;
        }
    int a,b;
    for (int i = 1; i <=m; i++){
        cin>>a>>b;
        e[a][b] = 1;
        e[b][a] = 1;
    }
    book[1]=1;
    dfs(1);
    return 0;
}
/* 5 5
1 2
1 3
1 5
2 4
3 5 */

相似写法

#include<iostream>
#define MAX 101
using namespace std;
int main(){
    int n,m,e[MAX][MAX],que[MAX],book[MAX],cur;
    cin>>n>>m;//元素个数和边数
    for (int i = 1; i <=n; i++)
        for (int j = 1; j <=n; j++)
        {
            if(i==j)e[i][j]=0;
            else e[i][j]=9;
        }
    int a,b;
    for (int i = 1; i <=m; i++){
        cin>>a>>b;
        e[a][b] = 1;
        e[b][a] = 1;
    }
    //queue
    int head=1,tail=1;
    que[1]=1;
    tail++;
    book[1]=1;
    while (head<tail&&tail<=n)
    {
        cur=que[head];
        for (int i = 1; i <=n; i++)
        {
            if(e[cur][i]==1&&book[i]==0)
            {
                book[i]=1;
                que[tail]=i;
                tail++;
            }
        }
        if(tail>n)break;
        head++;

    }
    
    for (int i = 1; i < tail; i++)
    {
        cout<<que[i]<<" ";
    }
    
    return 0;

}

无向图深度优先遍历(DFS)和广度优先遍历(BFS)算法 定义 深度优先遍历 (1)从图中某个初始顶点v出发,首先访问初始顶点v。 (2)选择一个与顶点v相邻且没被访问过的顶点w,再从w出发进行深度优先搜索,直到图中与当前顶点v邻接的所有顶点都被访问过为止。   (3) 利用递归实现,简单但是不好理解,时间复杂度 O(n+e)。 广度优先遍历 (1)访问初始点v,接着访问v的所有未被访问过的邻接点v1,v2,…,vt。 (2)按照v1,v2,…,vt的次序,访问每一个顶点的所有未被访问过的邻接点。    (3)依次类推,直到图中所有和初始点v有路径相通的顶点 阅读详情

相关推荐

【数据结构与算法】图的遍历(深度优先遍历DFS算法

1.1深度优先遍历 深度优先遍历(depth first search),也有称为深度优先搜索简称DFS。它的主要思想就是例如找钥匙一样。例如:我们的一把车钥匙被搞丢了但是可以确定的是它一定就在家里的某个位置,所以我们需要从房间开始寻找,可是我们是该在房间某一处寻找还是将一整个房间搜索完之后再找其他房间的地方呢?在深度优先遍历意思就是将一个房间的所有地方搜索完之后再进行其他房间的搜索,直至找到车钥匙为止。 假设你现在需要完成一个任务,要知道你在如下迷宫中,从顶点A开始要走遍所有图中的顶点并作上标记,注.

m0_61886762的博客 9980

无向图深度优先遍历

描述     简单介绍一下图,图就是由一些小圆点(称为顶点)和连接这些小圆点的直线(称为边)组成的。例如下图的由五个顶点(编号1、2、3、4、5)和五条边(1-2、1-3、1-5、2-4、3-5)组成     现在从1号顶点开始遍历这个图,遍历是指把图的每一个顶点都访问一次。使用深度有限搜索来遍历这个图将会得到如下结果。     这五个顶点的访问顺序如下图     使用深度优先...

Gerald的博客 4万+

数据结构无向图深度优先遍历

以下面的图片为例题,仅给出源代码,不谈算法思想。 #include #include #include #define MAX_VERTEX_NUM 20+3 //最大顶点数量 //#define true 1 //#define false 0 using namespace std; typedef char VERTEX_TYPE; //顶点的类型 typedef struc

The poor student 6737

图的两种遍历:深度优先遍历+广度优先遍历

图的遍历 广度 深度 c语言

qq_63806300的博客 1万+

C语言:无向图深度优先遍历

文章目录 前言 一、代码 二、操作运行结果 前言 实验要求内容: 以邻接矩阵为存储结构建立无向图 编写无向图深度优先遍历函数。 以用户指定的顶点为起点,输出顶点的深度优先访问序列。 在主函数调用功能函数调试程序。 一、代码 全部代码: #include <stdio.h> #define MaxVex 100 //最大顶点数 #define INFINITY 65535 //表示∞ #de...

Aqu-蓝空的博客 8508

(数据结构) 无向图深度优先遍历

无向图深度优先遍历 1.定义图的邻接矩阵存储表示(AMGraph) 2.采用邻接矩阵表示法创建无向图(CreateUDG) 3.输出所建图的邻接矩阵(PrintAMGraph) 4.输出所建图的深度优先遍历序列(DFSTraverse) 例如: 5 6 //顶点数和边数的输入 1 2 3 4 5 //顶点信息的输入 1 2 //边信息的输入 1 4 2 3 3 4 2 5 3 5 0 1 0 1 0 //邻接矩阵的输出 1 0 1 0 1...

weixin_45944348的博客 5688

无向图的建立及深度优先遍历

无向图的建立及深度优先遍历一个图,有很多存储结构,例如邻接矩阵,邻接表,十字链表,邻接多重表等 下面写写一个无向图的邻接表存储,并实现其深度优先(DFS)遍历: 详细了解请参照严蔚敏写的《数据结构c语言版》163页(主要了解头结点和边结点) 话不多说直接上代码吧代码块// 实验四无向图深度优先搜索.cpp: 定义控制台应用程序的入口点。 //#include "stdafx.h"typedef

sg_________的博客 5127

C语言实现邻接矩阵创建无向图&图的深度优先遍历

Code /* '邻接矩阵' 实现无向图的创建、深度优先遍历*/ #include <stdio.h> #include <stdlib.h> #define MaxVex 100 //最多顶点个数 #define INFINITY 32768 //表示极大值,即 ∞ #define TRUE ...

weixin_30273763的博客 4024

邻接表无向图深度优先遍历C/C++代码实现

图的链式存储: 图的链式存储有多种,有邻接表、十字链表和邻接多重表,下面注意说明邻接表。 邻接表: 邻接表由两部分组 成:表头结点表和边表。 例: 深度优先遍历: 为了避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。 为此,设一 个辅助数组visited[n] , 其初始值置为"false"或者0, 一旦访问了顶点V, 便置visited[i]为"true" 或者1。 以该图为例: 代码如下: #include<stdio.h> #define MVNum 100

Ycy的博客 5646

无向图邻接表的深度优先遍历(DFS)

邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表)   头文件:Graph.h #ifndef GRAPH_H #define GRAPH_H #define MAXSIZE 50 typedef char VertexType; //顶点数据类型 typedef int EdgeType; //边权值类型 typedef struct edge

flying0033的专栏 8472

邻接矩阵无向图深度优先遍历C/C++代码实现

图的顺序存储: 图没有顺序存储结构,但可以借助二维数组来表示元素 之间的关系,即邻接矩阵表示法。 用邻接矩阵表示法表示图,除了一个用千存储邻接矩阵的二维数组外, 还需要用一个一维数 组来存储顶点信息。 深度优先遍历: 为了避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。 为此,设一 个辅助数组visited[n] , 其初始值置为"false"或者0, 一旦访问了顶点V, 便置visited[i]为"true" 或者1。 以该图为例: 代码如下: #include<stdio

Ycy的博客 4563

用邻接表存储无向图深度优先遍历

实现代码: #include<iostream> #include<queue> using namespace std; //用邻接表存储无向图深度优先遍历 #define MaxSize 10 #define inf 0x3f3f3f int n,m; //顶点数 边数 bool book[MaxSize]; //标记数组 queue<int>q; //边 struct ArcNode{ int data; ArcNode *next; };

weixin_47511190的博客 1958

无向图的创建和深度优先遍历,广度优先遍历

声明:下面的代码只是一个最基础的实现,没有经过严格的测试 图有两种表示方式,一种是邻接矩阵(二维数组),另一种是邻接表(数组+链表)。 下面的例子是针对于邻接链表实现的 上面的两幅图,第一副是无向图,第二幅是用邻接链表表示的无向图。 代码如下: /** * 图用来表示多对多的关系,数组和链表有前驱和后继,可以认为是一对一的关系。树是一对多的关系。 * 图的基本元素:顶点,边,路径,有向图,无向图,带权图(又称之为网),其他概念参考:https://www.cnblogs.com.

jialiang的博客 2855

无向图 深度优先遍历 c语言实现

无向图深度优先遍历的实现,无向图用邻接表表示无向图的表示:邻接矩阵和邻接表。程序使用的示例图为: 实现要点: 每个节点有三种状态-1,0,1,分别表示未发现,已经发现,已经处理。代码如下:#include <stdio.h> #include <stdlib.h> #include "graph_represent.h"//后序遍历图 void DFS(struct vNode** adj,i

x_i_y_u_e的专栏 7192

【数据结构C语言】深度优先遍历DFS检查无向图和有向图回路

【待更新...】 对天勤数据结构课后习题的深度思考: 问题:T218 1.(2) 解答:T226 1)有向图 在DFS的visited[]数组0,1状态上进行扩充,0表示为访问过,1表示已访问但还没监测完这个顶点可能出现的回路(即还没退出系统栈,处于有子结点还在访问的状态),2表示该结点已经退出系统栈(即不在递归层中)。进入DFS函数对v访问时,标记为1,然后访问子结点,如果子结点被访...

Read by heart 8893

无向图邻接表的深度优先遍历

#include #include #define Max 50 int visited[Max]; //边表节点 typedef struct EdgeNode { int adjvex;//储存对应顶点的下标 int weight;//用于储存权值 struct EdgeNode * p;//指向下一个边表节点 }EdgeNode;

zp961213的博客 8155
上一篇: 宽度优先搜索解决迷宫问题(最小步数求解)
下一篇: 宽度优先遍历无向图
dinosaur2004
博客等级 码龄3年 612粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值