十天学完基础数据结构-第七天(图(Graph))

在这里插入图片描述

图的基本概念

是一种数据结构,用于表示对象之间的关系。它由两个基本组件构成:

  • 顶点(Vertex):也被称为节点,代表图中的对象或实体。

  • 边(Edge):连接两个顶点的线,表示顶点之间的关系。

有向图和无向图的区别

图可以分为两种主要类型:

  • 无向图(Undirected Graph):边没有方向,表示两个顶点之间的关系是双向的。想象你和朋友之间的社交网络关系图,这就是一个无向图的例子。

  • 有向图(Directed Graph):边有方向,表示从一个顶点到另一个顶点的关系是单向的。一个典型的有向图示例是网页链接图,其中箭头表示链接方向。

图的遍历方法

遍历图意味着访问图中的所有顶点和边。两种常见的图遍历方法如下:

  • 深度优先搜索(DFS):DFS从起始顶点开始,沿着一条路径尽可能深入,直到无法继续为止,然后回溯到其他路径。这种方法类似于探险,一直往前走直到没有未探索的路径。

  • 广度优先搜索(BFS):BFS从起始顶点开始,首先访问所有直接相邻的顶点,然后逐层向外扩展。这种方法类似于水波扩散,先探索离起点最近的区域,然后逐渐扩展到更远的区域。

任务

创建和操作图数据结构,以及理解图的遍历算法。

示例代码 - 使用C++创建简单的无向图:

#include <iostream>
#include <vector>class Graph {
public:Graph(int vertices) : V(vertices) {adj = std::vector<std::vector<int>>(vertices);}void addEdge(int v, int w) {adj[v].push_back(w);adj[w].push_back(v);}void printGraph() {for (int v = 0; v < V; ++v) {std::cout << "顶点 " << v << " 的邻居: ";for (const int& neighbor : adj[v]) {std::cout << neighbor << " ";}std::cout << std::endl;}}private:int V; // 顶点数std::vector<std::vector<int>> adj; // 邻接表
};int main() {Graph g(5); // 创建一个具有5个顶点的图// 添加边g.addEdge(0, 1);g.addEdge(0, 4);g.addEdge(1, 2);g.addEdge(1, 3);g.addEdge(1, 4);g.addEdge(2, 3);g.addEdge(3, 4);// 打印图的邻接表g.printGraph();return 0;
}

运行结果: 在这里插入图片描述

练习题

  1. 解释图的基本概念中的顶点和边。

  2. 什么是有向图和无向图?可以给出一个实际生活中的例子吗?

  3. 描述深度优先搜索(DFS)和广度优先搜索(BFS)的工作原理。

  4. 你可以设计一个简单的图,表示你和你的朋友之间的社交关系。使用C++创建这个图并实现DFS或BFS来查找朋友之间的关系路径。

解释图的基本概念中的顶点和边。

  • 顶点:顶点也被称为节点,它们是图中的基本元素,代表对象或实体。在社交网络中,每个人可以被表示为一个顶点。

  • :边是连接两个顶点的线,表示顶点之间的关系。在社交网络中,如果两个人是朋友关系,就可以用一条边来表示这种关系。

什么是有向图和无向图?可以给出一个实际生活中的例子吗?

  • 有向图:有向图中,边有方向,表示从一个顶点到另一个顶点的关系是单向的。例如,Twitter中的关注关系就是一个有向图,其中用户A关注了用户B,但不一定反过来成立。

  • 无向图:无向图中,边没有方向,表示两个顶点之间的关系是双向的。例如,Facebook的好友关系可以用无向图表示,如果用户A是用户B的好友,那么用户B也是用户A的好友。

描述深度优先搜索(DFS)和广度优先搜索(BFS)的工作原理。

  • DFS(深度优先搜索):DFS从起始顶点开始,沿着一条路径尽可能深入,直到无法继续为止,然后回溯到其他路径。它使用栈数据结构或递归来实现。DFS类似于沿着分支往下走直到底部,然后再返回并探索其他分支。

  • BFS(广度优先搜索):BFS从起始顶点开始,首先访问所有直接相邻的顶点,然后逐层向外扩展。它使用队列数据结构来实现。BFS类似于水波扩散,先探索离起点最近的区域,然后逐渐扩展到更远的区域。

你可以设计一个简单的图,表示你和你的朋友之间的社交关系。使用C++创建这个图并实现DFS或BFS来查找朋友之间的关系路径。

这是一个简单的C++示例代码,一个社交关系图并执行DFS来查找朋友之间的关系路径。请注意,这只是一个示例,实际应用中的社交关系图通常更复杂。

#include <iostream>
#include <vector>
#include <queue>class Graph {
public:Graph(int vertices) : V(vertices) {adj = std::vector<std::vector<int>>(vertices);}void addEdge(int v, int w) {adj[v].push_back(w);adj[w].push_back(v);}void DFS(int start, int target, std::vector<bool>& visited, std::vector<int>& path) {visited[start] = true;path.push_back(start);if (start == target) {// 找到目标,打印路径std::cout << "关系路径: ";for (int vertex : path) {std::cout << vertex << " ";}std::cout << std::endl;} else {for (int neighbor : adj[start]) {if (!visited[neighbor]) {DFS(neighbor, target, visited, path);}}}// 回溯visited[start] = false;path.pop_back();}private:int V; // 顶点数std::vector<std::vector<int>> adj; // 邻接表
};int main() {Graph socialNetwork(7); // 创建一个具有7个顶点的社交关系图// 添加社交关系边socialNetwork.addEdge(0, 1);socialNetwork.addEdge(0, 2);socialNetwork.addEdge(1, 3);socialNetwork.addEdge(1, 4);socialNetwork.addEdge(2, 5);socialNetwork.addEdge(3, 6);std::vector<bool> visited(7, false);std::vector<int> path;std::cout << "查找朋友之间的关系路径:" << std::endl;socialNetwork.DFS(0, 6, visited, path); // 查找从顶点0到顶点6的关系路径return 0;
}

运行结果: 在这里插入图片描述

注意:这个示例代码演示了如何创建一个社交关系图,并使用DFS来查找朋友之间的关系路径。实际应用中,社交网络可能包含更多顶点和更复杂的关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148969.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

商业智能系统的主要功能包括数据仓库、数据ETL、数据统计输出、分析功能

ETL服务内容包含&#xff1a; 数据迁移数据合并数据同步数据交换数据联邦数据仓库

抖音聊天对话模板,制作一条一条冒出来的聊天对话短视频

聊天对话模板是一种非常有趣且实用的工具&#xff0c;它主要用于制作抖音聊天记录一条一条冒出来的视频。有了聊天对话模板&#xff0c;你再也不需要费心去写剧本&#xff0c;只需输入一些简单的文案&#xff0c;就能自动生成搞笑对话视频。 聊天对话工具下载&#xff1a; htt…

linux内核分析:网络协议栈

从本质上来讲,所谓的建立连接,其实是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,并用这样的数据结构来保证面向连接的特性。TCP 无法左右中间的任何通路,也没有什么虚拟的连接,中间的通路根本意识不到两端使用了 TCP 还是 UDP。 所谓的连接…

【C++】String -- 详解

⚪C语言中的字符串 C 语言中&#xff0c;字符串是以 \0 结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C 标准库中提供了一些 str 系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合 OOP 的思想&#xff0c;而且底层空间需要用户自己…

C语言判断语句

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 下面…

力扣第102题 广度优先搜索 二叉数 c++

题目 102. 二叉树的层序遍历 中等 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20…

CSDN博主粉丝数突破10万:坚持分享的力量与收获

今天&#xff0c;我在CSDN上看到了一位好友的统计数据&#xff0c;他统计了CSDN上所有粉丝数量排名靠前的博主的排名。虽然这个统计可能存在一些误差&#xff0c;但大体上应该是准确的。我惊讶地发现&#xff0c;截止到2023年10月4日&#xff0c;我的粉丝数量已经达到了101,376…

uniapp项目实践总结(二十五)苹果 ios 平台 APP 打包教程

导语:当你的应用程序开发完成后,在上架 ios 应用商店之前,需要进行打包操作,下面就简单介绍一下打包方法。 目录 准备工作注册账号生成证书打包配置准备工作 在打包之前,请保证你的 uniapp 应用程序编译到 ios 模拟器或者是真机调试基座环境下是可以正常运行的,苹果打包…

二叉树题目:路径总和 II

文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;路径总和 II 出处&#xff1a;113. 路径总和 II 难度 4 级 题目描述 要求 给你二叉树的根结点 root \tex…

基于三平面映射的地形纹理化【Triplanar Mapping】

你可能遇到过这样的地形&#xff1a;悬崖陡峭的一侧的纹理拉伸得如此之大&#xff0c;以至于看起来不切实际。 也许你有一个程序化生成的世界&#xff0c;你无法对其进行 UV 展开和纹理处理。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 三平面映射&#xff08;Trip…

侯捷 C++ STL标准库和泛型编程 —— 9 STL周围

最后一篇&#xff0c;完结辽&#xff01;&#x1f60b; 9 STL周围 9.1 万用Hash Function Hash Function的常规写法&#xff1a;其中 hash_val 就是万用Hash Function class CustumerHash { public:size_t operator()(const Customer& c) const{ return hash_val(c.fna…

DevEco Studio设置Nodejs提示路径只能包含英文、数字、下划线等

安装DevEco Studio 3.1.1 Release 设置Nodejs路径使用nodejs默认安装路径 &#xff08;C:\Program Files\nodejs&#xff09; 提示只能包含英文、数字、下划线等 , 不想在安装nodejs请往下看 nodejs默认路径报错 修改配置文件 1、退出DevEco Studio 2、打开配置文件 cmd控制台…

Visopsys 0.92 发布

Visopsys 是一个 PC 机的操作系统&#xff0c;系统小型、快速而且开源。有着丰富的图形界面、抢先式多任务机制以及支持虚拟内存。Visopsys 视图兼容很多操作系统&#xff0c;但并不是他们的克隆版本。Visopsys 0.92 现已发布&#xff0c;此维护版本引入了多任务处理程序、文件…

卸载无用Mac电脑软件应用程序方法教程

如何在Mac电脑卸载应用程序&#xff1f;Mac OS系统的用户卸载软件时&#xff0c;大部分会选择直接将软件图标拖进废纸篓清倒。这种操作会留下大量程序残余文件占据磁盘空间&#xff0c;手动清理又怕误删文件&#xff0c;有时还会遇到无法移除的恶意/流氓软件。小编今天分享3种可…

zookeeper选举机制

全新集群选举 zookeeper 全新集群选举机制网上资料很多说法很模糊&#xff0c;仔细思考了一下&#xff0c;应该是这样 得到票数最多的机器>机器总数半数 具体启动过程中的哪个节点成为 leader 与 zoo.cfg 中配置的节点数有关&#xff0c;下面以3个举例 选举过程如下 server…

540. 有序数组中的单一元素

链接&#xff1a; 540. 有序数组中的单一元素 代码&#xff1a; 方法一&#xff1a;全数组的二分查找 思路和算法 假设只出现一次的元素位于下标 xxx&#xff0c;由于其余每个元素都出现两次&#xff0c;因此下标 xxx 的左边和右边都有偶数个元素&#xff0c;数组的长度是奇…

【2023年11月第四版教材】第18章《项目绩效域》(第一部分)

第18章《项目绩效域》&#xff08;第一部分&#xff09; 1 章节内容2 干系人绩效域2.1 绩效要点2.2 执行效果检查2.3 与其他绩效域的相互作用 3 团队绩效域3.1 绩效要点3.2 与其他绩效域的相互作用3.3 执行效果检查3.4 开发方法和生命周期绩效域 4 绩效要点4.1 与其他绩效域的相…

新版校园跑腿独立版小程序源码 多校版本,多模块,适合跑腿,外卖,表白,二手,快递等校园服务

最新校园跑腿小程序源码 多校版本&#xff0c;多模块&#xff0c;适合跑腿&#xff0c;外卖&#xff0c;表白&#xff0c;二手&#xff0c;快递等校园服务 此版本为独立版本&#xff0c;不需要** 直接放入就可以 需要自己准备好后台的服务器&#xff0c;已认证的小程序&#xf…

MyBatisPlus(九)模糊查询

说明 模糊查询&#xff0c;对应SQL语句中的 like 语句&#xff0c;模糊匹配“要查询的内容”。 like /*** 查询用户列表&#xff0c; 查询条件&#xff1a;姓名包含 "J"*/Testvoid like() {String name "J";LambdaQueryWrapper<User> wrapper ne…

讲讲项目里的仪表盘编辑器(二)

应用场景 正常来说&#xff0c;编辑器应用场景应该包括&#xff1a; 编辑器-预览 编辑器 最终运行时 怎么去设计 上一篇推文&#xff0c;我们已经大概了解了编辑器场景。接下来&#xff0c;我们来看预览时的设计 编辑器-预览 点击预览按钮&#xff0c;执行以…