邻接矩阵的深度优先搜索技术

article/2025/9/13 1:55:42

概述

深度优先搜索(Depth First SearchDFS),是最常见的图搜索方法之一。深度优先搜索沿着一条路径一直走下去,无法行进时,回退回退到刚刚访问的结点,似不撞南墙不回头,不到黄河不死心。深度优先遍历是按照深度优先搜索的方式对图进行遍历。

tips:后被访问的顶点,其邻接点先被访问。所以这是后来的先访问,可以借助栈的特性实现,而递归就是用栈来实现的,因此可以使用递归

算法

1.初始化图中所有顶点未被访问.

2.从图中的某个顶点v出发,访问v并标记已访问.

3.依次检查v的所有邻接点w,如果w未被访问,则从w出发进行深度优先遍历(递归调用,重复2—3步)

细节描述

1.想要弄懂邻接矩阵的深度优先搜索,首先需要保证你的邻接矩阵已经非常熟悉了

2.关于怎么使用标记,这里可以创建一个数组,起名visited,得出visited[],其中的大小是你所存储的图中,顶点的个数,全部初始化为false,因为是bool型数组.  还有,你的顶点是存放在顶点集数组中,每个元素都有其对应的元素下标,而这些下标都是与visited数组的下标是一 一对应的,当你输出顶点集的某个元素比如第3个元素,那么visited[2]就会被标记为true,代表你已经访问过该顶点了

3.递归的实现,简单来说就是函数套函数,看面的代码

当该节点是邻接点(代表G.Edge==1),并且未被访问对其进行深度优先遍历,怎么保证所有顶点都被访问到?是由下面的for语句进行保证的,可以自己体会一下.

void DFS_AM(AMGragh G, int v)
{cout << G.vex[v] << " ";visited[v] = true;for (int w = 0; w < G.vexnum; w++){if (G.Edge[v][w] && !visited[w]){DFS_AM(G, w);}}
}

4 .访问的邻接点的顺序是从小到大的,这是for循环决定的

 

完整代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
using namespace std;const int maxnum = 100;
bool visited[maxnum];
typedef char VexType;
typedef int EdgeType;struct AMGragh
{VexType vex[maxnum];EdgeType Edge[maxnum][maxnum];int vexnum, edgenum;
};int locatevex(AMGragh G, VexType x)
{for (int i = 0; i < G.vexnum; i++){if (x == G.vex[i]){return i;}}return -1;
}void CreatAMGragh(AMGragh& G)
{VexType u, v;cout << "请输入顶点数和边数" << endl;cin >> G.vexnum >> G.edgenum;cout << "请输入顶点信息" << endl;for (int i = 0; i < G.vexnum; i++){cin >> G.vex[i];}for (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++){G.Edge[i][j] = 0;}}cout << "请输入每条边所依附的两个顶点" << endl;while (G.edgenum--){VexType u, v;cin >> u >> v;int i = locatevex(G, u);int j = locatevex(G, v);if (i != -1 && j != -1){G.Edge[i][j] = G.Edge[j][i] = 1;}else{cout << "输入有误,重新输入" << endl;G.edgenum--;}}
}void Print(AMGragh G)
{for (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++){cout << G.Edge[i][j] << " ";}cout << endl;}
}void DFS_AM(AMGragh G, int v)
{cout << G.vex[v] << " ";visited[v] = true;for (int w = 0; w < G.vexnum; w++){if (G.Edge[v][w] && !visited[w]){DFS_AM(G, w);}}
}int main()
{AMGragh G;CreatAMGragh(G);Print(G);cout << "请输入图的起点" << endl;VexType c;cin >> c;int i = locatevex(G, c);if (i != -1){cout << "深度优先" << endl;DFS_AM(G, i);}else{cout << "输入有误" << endl;}system("pause");return EXIT_SUCCESS;
}

 


http://chatgpt.dhexx.cn/article/NSoVfcpG.shtml

相关文章

图-深度优先遍历

概述 深度优先遍历&#xff0c;从初始访问结点出发&#xff0c;初始访问结点可能有多个邻接结点&#xff0c;深度优先遍历的策略就是首先访问第一个邻接结点&#xff0c;然后再以这个被访问的邻接结点作为初始结点&#xff0c;访问它的第-一个邻接结点&#xff0c;可 以这样理解…

深度优先搜索python

深度优先搜索 概念 深度优先搜索和广度优先搜索一样&#xff0c;都是对图进行搜索的算法&#xff0c;目的也都是从起点开始搜索直到到达指定顶点&#xff08;终点&#xff09;。深度优先搜索会沿着一条路径不断往下搜索直到不能再继续为止&#xff0c;然后再折返&#xff0c;…

DFS——深度优先搜索

什么是DFS DFS&#xff0c;中文名深度优先搜索&#xff0c;是一种图的搜索方式&#xff0c;本质上是一种递归。 dfs相当自由&#xff0c;学dfs可能最高境界就和打太极似的&#xff0c;无招胜有招 DFS的经典应用&#xff1a; 1.全排列 虽然感觉没有贴题目的必要 这应该是大多数d…

算法详解之深度优先搜索算法

14天阅读挑战赛 文章目录 1、深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09;介绍2、深度优先搜索算法思想3、深度优先搜索算法步骤&#xff1a;4、深度优先搜索算法的应用 1、深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09…

第七章:深度优先搜索

不撞南墙不回头-深度优先搜索 广度优先搜索BFS是每次将当前状态能够一步拓展出的所有状态&#xff0c;全部拓展出来依次存入队列。而深度优先搜索是将当前状态按照一定的规则顺序&#xff0c;先拓展一步得到一个新状态&#xff0c;再对这个这个新状态递归拓展下去。如果无法拓…

Java实现深度优先搜索

Java实现深度优先搜索 图的遍历 图的遍历就是访问图中的每个节点并且每个节点只访问一次。但图中有那么多节点&#xff0c;要如何进行访问就是一个问题&#xff0c;所以我们需要有特定的策略来进行访问这些节点。图的访问策略一般有两种&#xff1a;深度优先搜索和广度优先搜…

深度优先搜索

深度优先搜索&#xff1a; 深度优先搜索是对先序遍历的一般化。我们从某个节点开始&#xff0c;先处理&#xff0c;并将标记为已知&#xff0c;然后任意选择的一个邻接顶点&#xff0c;对其进行深度优先搜索&#xff0c;这样就递归的遍历了图的所有顶点。当图中有圈时&#xf…

【基础知识】一文看懂深度优先算法和广度优先算法

概览 先上个图 现在我们要访问图中的每个节点&#xff0c;即图的遍历。 图的遍历是指&#xff0c;从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发&#xff0c;按照某种搜索方法沿着图的边访问图中的所有顶点&#xff0c;使每个顶点仅被访问一次&#xff…

深度优先搜索(DFS),看这一篇就够了。

一&#xff0c;定义&#xff1a; 深度优先搜索的思路和树的先序遍历很像&#xff0c;下面是百度百科上的定义&#xff1a; 深度优先遍历图的方法是&#xff0c;从图中某顶点v出发&#xff1a; &#xff08;1&#xff09;访问顶点v&#xff1b; &#xff08;2&#xff09;依次从…

Python实现深度优先遍历(DFS)和广度优先遍历(BFS)

一&#xff0c;简介 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法&#xff0c;生产上广泛用于拓扑排序&#xff0c;寻路(走迷宫)&#xff0c;搜索引擎&#xff0c;爬虫等&#xff0c;也频繁出现在 leetcode&am…

算法数据结构——图的遍历之深度优先搜索算法(Depth First Search)

1. 深度优先搜索简介 深度优先搜索算法&#xff08;Depth First Search&#xff09;&#xff1a;英文缩写为 DFS。是一种用于搜索树或图的算法。所谓深度优先&#xff0c;就是说每次都尝试向更深的节点走。 深度优先搜索采用了回溯思想&#xff0c;该算法沿着树的深度遍历树的节…

【新书速递】实用安全多方计算导论

安全多方计算&#xff08;MPC&#xff09;是解决数据安全与隐私保护问题的关键安全数据交换技术&#xff0c;近年来发展迅速&#xff0c;但由于MPC涉及复杂的密码学和工程实现技术&#xff0c;行业长期缺乏同时具备MPC研究、应用和实现能力的综合性人才&#xff0c;这阻碍了MPC…

百万富翁问题--安全多方计算

百万富翁问题—安全多方计算 是由图灵奖获得者姚期智提出的。 有A、B两个富翁&#xff0c;A资产i亿元&#xff0c;B资产j亿元&#xff0c;i、j均在0-10范围内&#xff0c;在互不让对方知道自己资产的情况下&#xff0c;比较A和B的资产谁多谁少。 那么如何去比较呢&#xff1f;…

隐私保护技术之安全多方计算

安全多方计算(Secure Multi-Party Computation&#xff0c;SMPC)用于解决一组互不信任的参与方各自持有秘密数据&#xff0c; 协同计算一个既定函数的问题。安全多方计算在保证参与方获得正确计算结果的同时&#xff0c;无法获得计算结果之外的任何信息。 在整个计算过程中&…

基于同态加密体制的安全多方计算

本文首发公众号VenusBlockChain&#xff0c;关注公众号后可免费阅读&#xff01;VenusBlockChain致力于区块链技术研究&#xff0c;传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。有兴趣的小伙伴们&#xff0c;欢迎关注。 安全多方计算&#xff08;Secure Mu…

多方安全计算

说明&#xff0c;本文是转载的&#xff0c;个人觉得作者讲解清晰明了&#xff0c;收录用于学习&#xff0c;原文链接&#xff1a;https://blog.csdn.net/yuxinqingge/article/details/104588197。 如今&#xff0c;互联网已经完成了从IT时代向DT时代转变&#xff0c;数据已经成…

多方安全计算MPC

1.多方安全计算的价值 MPC是密码学的一个重要分支&#xff0c;旨在解决一组互不信任的参与方之间保护隐私的协同计算问题&#xff0c;为数据需求方提供不泄露原始数据前提下的多方协同计算能力。 在目前个人数据毫无隐私的环境下&#xff0c;对数据进行确权并实现数据价值显得…

安全多方计算(MPC)

MPC既适用于特定的算法&#xff0c;如加法、乘法、AES&#xff0c;集合交集等&#xff1b;也适用于所有可表示成计算过程的通用算法。 根据计算参与方个数不同&#xff0c;可分为只有两个参与方的2PC和多个参与方&#xff08;≥3&#xff09;的通用MPC 1&#xff09;安全两方&a…

安全多方计算之二:一文搞懂百万富翁问题

百万富翁问题 1. 解决方案2. 协议描述3. 协议说明4. 协议举例5. 协议扩展 两个百万富翁Alice和Bob想知道他们两个谁更富有&#xff0c;但他们都不想让对方及其他第三方知道自己财富的任何信息&#xff0c;这是由中国计算机科学家、2000年图灵奖获得者姚启智教授于1982年在论文《…

安全多方计算-入门学习笔记(三)

四、基于非噪音的安全多方计算介绍 1概念 非噪音方法一般是通过密码学方法将数据编码或加密&#xff0c;得到一些奇怪的数字&#xff0c;而且这些奇怪的数字有一些神奇的性质&#xff0c;比如看上去很随机但其实保留了原始数据的线性关系&#xff0c;或者顺序明明被打乱但人们…