深度优先搜索 DFS(邻接矩阵表示)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//#define PATH
#define VERTEX_NUM 8

#ifdef PATH
int count = 1;
#endif
bool visited[VERTEX_NUM + 1];        // 访问标志数组(备忘表)

int FirstAdjVex(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1], int v)
{
    for (int j = 1; j <= VERTEX_NUM; j++) {
        if (G[v][j] == 1)
            return j;
    }
    cout << "该点是孤立点" << endl;    // 连通图则不会到这一步
    return -1;
}

int NextAdjVex(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1], int v, int w)
{
    for (int j = w + 1; j <= VERTEX_NUM; j++) {
        if (G[v][j] == 1)
            return j;
    }
    return -1;
}


void DFS(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1], int v)
{
    // 从第v个顶点出发递归地深度优先遍历图G。
    int w;
    visited[v] = true;
    cout << v << endl;
    for (w = FirstAdjVex(G, v);  w != -1;  w = NextAdjVex(G, v, w)) {
#ifdef PATH
        cout << "------------------" << count++ << "----" << v << "->" << w << endl;    // 1
#endif
        if (!visited[w]) {        // 对v的尚未访问的邻接顶点w递归调用DFS
            DFS(G, w);
#ifdef PATH
            cout << v << endl;    // 有待研究?                                            // 2
#endif
        }
    }
#ifdef PATH
    cout << "回溯路径" << v << "->";                                                    // 3
#endif
}

void DFSTraverse(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1])
{
    // 对图G作深度优先遍历。
    int v;
    for (v = 1; v <= VERTEX_NUM; ++v)
        visited[v] = false;                    // 访问标志数组初始化
    for (v = 1; v <= VERTEX_NUM; ++v) {        // 若是连通图,则v=1即全遍历到
        if (!visited[v])
            DFS(G, v);                        // 对尚未访问的顶点调用DFS
    }
}

int main(int argc, char **argv)
{
    freopen("cin.txt", "r", stdin);
    bool G[VERTEX_NUM + 1][VERTEX_NUM + 1] = {0};
    int a;
    int b;
    while (cin >> a >> b, !(a == 0 && b == 0)) {    //以0 0作为输入结束
        G[a][b] = 1;
        G[b][a] = 1;
    }
    for (int i = 1; i <= VERTEX_NUM; i++) {            // 输出邻接矩阵
        for (int j = 1; j <= VERTEX_NUM; j++) {
            cout << G[i][j] << ' ';
        }
        cout << endl;
    }

    DFSTraverse(G);
    cout << endl;

    return 0;
}

/* cin.txt:
2
4
5
4
5
3
6
7
7
0
*/


数据结构——图的深度遍历(邻接矩阵DFS)(无向图) 数据结构DFS 阅读详情

相关推荐

深度优先搜索DFS——图邻接矩阵表示

同样的DFS,这个是用邻接矩阵保存的图,或许应用没有那么广,要浪费较多的空间,但是还是有必要实现一下的,和之前那个算法的思想是一样的,只是变换了存储结构。 /* 图邻接矩阵表示DFS input: 1 7 A 0 0 0 0 1 0 0 B 0 0 1 1 0 0 0 C 0 1 0 1 0 0 0 D 0 1 0 0 1 1 0 E 1 0 0 1 0 0 1 F 0 0 0 1 0 0 0

That 5145

利用邻接矩阵用递归和栈分别实现DFS

大家好,今天给大家分享一下DFS的实现。DFS指的是从某一节点开始,树的深度遍历。 首先创建邻接矩阵,创建邻接矩阵时: 定义无向图的结构体 输入顶点个数 分别输入顶点 对邻接矩阵初始化,初始化边的权值为无穷大 输入边的个数n,分别输入n次两顶点及其所连的边的权值,并且找到顶点位置给边赋值 之后便可以 ...

m0_50317977的博客 1464

数据结构与算法王卓-习题-第六章图-采用邻接矩阵表示图的深度优先搜索遍历(DFS)算法

目录 算法描述 算法预期效果 重难点 思路 个人解法 总结 测试样例与输出 算法描述 创建图的邻接矩阵, 并输出dfs深度优先搜索遍历结果 算法预期效果 依次输入顶点数,边数,顶点V1~Vn,边A1~An,根据输入的顶点与边的关系,输出形如右边的邻接矩阵,接着使用DFS进行深度优先遍历,输出所有结点。 效果一:输出形如右边的邻接矩阵 效果二:输出类似右下角的遍历结果 重难点 个人认为难点一是理解递归的结构,以及如何回退;难点二是visited数组如何声明与引用 思路.

”好的程序员不应该花大量时间在程序调试上,bug从一开始就不该被引入“ 1356

邻接矩阵/图/DFS/BFS

目录1.邻接矩阵表示2.邻接矩阵的存储3.采用邻接矩阵表示法创建无向网 4.基于邻接矩阵的图上各类操作 5.DFS6.BFS7.测试程序(待完成) 权与网连通分量(强连通分量) 无向图 有向图 网(有权图) 3.采用邻接矩阵表示法创建无向网 创建无向图和有向图的区别 优缺点 声明 广度优先搜索需要的队列(图的遍历) 基于邻接矩阵的图上操作 5.DFS 深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩DFS即Depth First Search。深度优先搜

m0_61548909的博客 2442

图的邻接矩阵DFS遍历

图的存储结构相对于线性表和树来说,是复杂了许多,而不是用一个线性表或者链表就能定义的。对于图来说,它的存储方式有邻接矩阵,邻接表,十字链表,邻接多重表和边集数组。在这里,要介绍的是如果使用邻接矩阵和邻接表来存储图结构。一、邻接矩阵图的邻接矩阵存储是用两个数组来完成的。一个一维数组存储定点信息(称为顶点数组),一个二维数组存储边信息(称为边数组)。 下面介绍不同类型的邻接矩阵的定义。1. 无向图的邻

XXX 1万+

图的DFS算法在邻接矩阵/邻接表下的非递归实现【C/C++】

图的DFS算法在邻接矩阵下的非递归实现

bblb的博客 2022

图的深度优先搜索DFS)——图用邻接矩阵表示

该程序是用图的邻接举着实现的。如果想用图的邻接链表实现DFS算法,只要把该程序中的firstAdj()和nextAdj()以及图的创建等操作改用邻接链表实现即可,其他的如DFS主程序框架可以不用修改。 temp.cpp //图的深度优先搜索DFS) //图用邻接矩阵表示 #include #include #include "temp.h" using namespace std; i

liuzhushiqiang的专栏 1191

图:邻接矩阵表示法创建无向图并深度优先搜索遍历

无向图表示: 代码: #include<iostream> using namespace std; #define pointMax 100 #define MaxInt 32767 struct AMgroup { char VTchart[pointMax]; //顶点表 int AMchart[pointMax][pointMax]; //邻接矩阵 int point, vert; ...

双鱼座boyy的博客 6477

第6章-算法6.5采用邻接矩阵表示图的深度优先搜索遍历

第6章-算法6.5采用邻接矩阵表示图的深度优先搜索遍历 代码实现 #pragma once #include <iostream> using namespace std; #define MVNum 100 //图的邻接矩阵存储(创建无向图) //表示极大值 #define MaxInt 0 //最大顶点数 #define MVNum 100 //顶点类型 typedef char VerTexType; //边上的权值类型 typedef int ArcType; typed

weixin_48192326的博客 1163

邻接矩阵表示深度优先搜索

#include #include #define MAXVEX 100//最大顶点数 typedef struct { char vexs[MAXVEX];//顶点表 int edges[MAXVEX][MAXVEX];//邻接矩阵 int n, e;//顶点数和边 }MGraph; int visited[100]; void DFSM(MGraph *G,

cool_oyty的专栏 863

DS图遍历--深度优先搜索

DS图遍历--深度优先搜索 题目描述 给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始 注意:图n个顶点编号从0到n-1 代码框架如下: 输入 第一行输入t,表示有t个测试实例 第二行输入n,表示第1个图有n个结点 第三行起,每行输入邻接矩阵的一行,以此类推输入n行 第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开 以此类推...

weixin_34015566的博客 104

邻接矩阵表示图的深度优先搜索和广度优先搜索

图的深度优先搜索DFS): 可以被形象的描述为“打破沙锅问到底”,具体一点就是访问一个顶点之后,我继而访问它的下一个邻接的顶点,如此往复,直到当前顶点一被访问或者它不存在邻接的顶点。同样,算法导论采用了“聪明的做法”,用三种颜色来标记三种状态。但这三种状态不同于广度优先搜索:WHITE 未访问顶点GRAY 一条深度搜索路径上的顶点,即被发现时BLACK 此顶点的邻接顶点被全部访问完

herongwei 的 BLOG 2619

dfs深度优先搜索邻接矩阵 + 邻接矩阵-递归版 + 邻接表

【代码】dfs深度优先搜索邻接矩阵 + 邻接矩阵-递归版 + 邻接表。

lllay_的博客 462

邻接矩阵,邻接链表DFS深度优先搜索C语言

图主要有两种存储结构,邻接矩阵表示法,邻接链表表示法。以有9个顶点的图为例。如图所示邻接矩阵表示法typedef struct { //邻接矩阵 elemtype data[9]; elemtype connect[9][9]; }graph,* graphpoint;建立9个元素的数组用于表示元素并建立对应关系矩阵用于表示顶点之间的关系邻接链表表示法ty...

Hello World.c 1516

邻接矩阵表示图的深度优先搜索遍历

这次用了点c++,用c的话需要考虑吞字符,一开始没想到,完了也就没改。 运行结果: #include <iostream> using namespace std; #define MaxInt 32767 #define MVNum 100 #define OK 1; bool visited[MVNum]; typedef int Status; typedef char VerTexType; typedef int ArcType; typedef struct { VerTexT

weixin_46106870的博客 1038

深度优先搜索DFS邻接矩阵实现

顶点2的所有邻接点已处理完毕。顶点1的所有邻接点已处理完毕。顶点0的所有邻接点已处理完毕。(对角线元素,跳过)

Wjs153612的博客 1616

图的深度优先搜索-递归

图的深度优先搜索的过程: (1)从图的某个顶点V出发,访问V. (2)找出刚访问过的顶点的第一个未被访问的邻接点,访问该顶点。以该顶点为新顶点,重复此步骤,直到 刚顶点没有未bedi被访问的邻接点为止。 (3)返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该din 顶点的下一个未被访问的邻接点,访问该顶点。 (4)重复步骤(2)和(3),直到图中所有的顶点都被访问过,搜索结束。 例如,上图的深度遍历过程如下: (1)从a顶点出发,访问a。 (2)从a出发,访问第一个未被访问的邻接

千言万语ROOM 2329

深度优先搜索和广度优先搜索

1.深度优先搜索 深度优先搜索(Depth First Search),简称DFS。思想为总是对最近才发现的结点v的出发边进行搜索,指导该结点的所有出发边都被发现为止。 伪码描述: void DFS(Vertex v) { visited[v]=true; for(v的每个连接点w) if(!visited[w]) DFS(w); } 代码如下 1. #include<queue> #define Max_Vertex 10 typedef cha

matlab_haha的博客 846

DFS(图的表示与深度历遍搜索)

DFS基础 图的表示方法(2种) 一般我们用邻接矩阵和邻接表来表示图的关系 邻接矩阵 用一个二维数组G存放图,G[i][j]表示节点i和节点j之间边的情况(如有无边,边方向,权值大小等) 。 遍历复杂度:O(n2) n为节点数目 G[n][n] 1 2 3 4 5 6 7 8 9 10 1 0 1 1 0 0 0 0 0 0 0 2 1 0 0 1 0 0 0 0 0 ...

One of thre_tigers的博客 1587
上一篇: 二叉树遍历,栈实现二叉树的非递归遍历
下一篇: 深度优先搜索DFS(邻接表实现)
tham_
博客等级 码龄12年 233粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值