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

news2024/11/14 15:33:13

在这里插入图片描述

图的基本概念

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

  • 顶点(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.coloradmin.cn/o/1061117.html

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

相关文章

【setxattr+userfaultfd】SECCON2020-kstack

这个题主要还是练习 userfaultfd 的利用。说实话&#xff0c;userfaultfd 的利用还是挺多的&#xff0c;虽然在新的内核版本已经做了相关保护。 老规矩&#xff0c;看下启动脚本 #!/bin/sh qemu-system-x86_64 \-m 128M \-kernel ./bzImage \-initrd ./rootfs.cpio \-append …

第三章、运输层

文章目录 3.1 概述和运输层服务3.1.1 运输层和网络层的关系3.1.2 因特网运输层概述 3.2 多路复用与多路分解3.3 无连接运输&#xff1a;UDP3.4 可靠数据传输原理3.4.1构造可靠数据传输协议rdt1.0rdt2.xrdt3.0 3.4.2 流水线可靠数据传输协议3.4.3 回退N步3.4.4选择重传 3.5 面向…

x64内核实验1-调试环境配置

x64内核实验1-调试环境配置 这是一套x64内核实验的课程&#xff0c;我之前学习32位内核的时候就是在网上找的各种教程当学完32位很久之后发现在网上的64位内核相关的完整教程真的很少&#xff0c;所以就想着不如自己写一点方便对内核有兴趣的人能更好的入门&#xff0c;首先声…

哈希原理和解决哈希冲突方法

第一 哈希介绍 哈希和红黑树是我早期就听过的名词&#xff0c;却一直没见到真面目&#xff0c;实现哈希后才发现原来我早就使用过了哈希。看下面例题。 用map和set都可以轻松解决&#xff0c;但是在我写这题时我还不会用map和set&#xff0c;我用了另一种方法。看下面代码。先定…

【Java】微服务——Nacos配置管理(统一配置管理热更新配置共享Nacos集群搭建)

目录 1.统一配置管理1.1.在nacos中添加配置文件1.2.从微服务拉取配置1.3总结 2.配置热更新2.1.方式一2.2.方式二2.3总结 3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&#xff0c;使用不同的pr…

Office Tool Plus下载与神龙版官网下载

文章目录 一、Office Tool Plus下载二、神龙下载 Office Tool Plus简称OTP&#xff0c;是一款专业的Office官方镜像下载器&#xff0c;可以下载安装Word、Excel、Visio等。神龙用于快速激活使用。 注意&#xff1a;Win7系统必须要SP1或更高版本才能使用&#xff0c;Office Tool…

intel 一些偏门汇编指令总结

intel 汇编手册下载链接&#xff1a;https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html LDS指令&#xff1a; 手册中可以找到 位于 3-588 根据手册内容猜测&#xff1a;lds r16 m16:16 的作用&#xff0c;是把位于 [m16:16] 内存地址的数…

JMeter的详细使用及相关问题

一、中文乱码问题 如果出现乱码&#xff0c;需要修改编码集&#xff0c;&#xff08;版本问题有的不需要修改&#xff0c;就不用管&#xff09; 修改后保存重启就好了。 JMeter5.5版本的按照如下修改&#xff1a; 二、JMeter的启动 ①建议直接用ApacheJMeter.jar双击启动…

Zabbix4自定义脚本监控MySQL数据库

一、MySQL数据库配置 1.1 创建Mysql数据库用户 [rootmysql ~]# mysql -uroot -p create user zabbix127.0.0.1 identified by 123456; flush privileges; 1.2 添加用户密码到mysql client的配置文件中 [rootmysql ~]# vim /etc/my.cnf.d/client.cnf [client] host127.0.0.1 u…

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

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

QScrollArea样式

QScrollBar垂直滚动条分为sub-line、add-line、add-page、sub-page、up-arrow、down-arrow和handle几个部分。 QScrollBar水平滚动条分为sub-line、add-line、add-page、sub-page、left-arrow、right-arrow和handle几个部分。 部件如下图所示&#xff1a; /* 整个滚动…

Pikachu靶场——文件包含漏洞(File Inclusion)

文章目录 1. File Inclusion1.2 File Inclusion(local)1.2.1 源代码分析1.2.2 漏洞防御 1.3 File Inclusion(remote)1.3.1 源代码分析1.3.2 漏洞防御 1.4 文件包含漏洞防御 1. File Inclusion 还可以参考我的另一篇文章&#xff1a;文件包含漏洞及漏洞复现。 File Inclusion(…

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

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

plt 画图不显示label

没写 plt.legend() 这个 ! # 效果模拟-------------- import matplotlib.pyplot as plt import matplotlib as mpl # matplotlib其实是不支持显示中文的 显示中文需要一行代码设置字体 mpl.rcParams[font.family] = STKAITI # STKAITI——字体 plt.rcParams[axes.unicode_m…

亲,您的假期余额已经严重不足了......

引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 转眼八天长假已经接近尾声了&#xff0c;今天来总结一下大家的假期&#xff0c;聊一聊假期关于学习的看法&#xff0c;并预估一下大家节后大家上班时的样子。 1.放假前一天 即将迎来八天…

侯捷 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…

x64内核实验2-段机制的变化

x64内核实验2-段机制的变化 ia-32e模式简介 x86下的段描述符结构图如下 在x86环境下段描述符主要分为3个部分的内容&#xff1a;base、limit、attribute&#xff0c;而到了64位环境下段的限制越来越少&#xff0c;主要体现在base和limit已经不再使用而是直接置空&#xff0…

U盘里文件损坏无法打开怎么恢复?

U盘&#xff0c;全称为USB闪存盘&#xff0c;是一种体积小巧、传输数据速度快的便携式存储设备。由于其出色的便捷性和高效性&#xff0c;U盘在各个工作领域和日常生活中得到了广泛应用&#xff0c;赢得了消费者的普遍好评。然而&#xff0c;使用U盘的过程中也可能会面临数据损…

Zabbix配置监控文件系统可用空间小于30GB自动告警

一、创建监控项 二、配置监控项 #输入名称–>键值点击选择 #找到磁盘容量点击 注&#xff1a; 1、vfs 该键值用于检测磁盘剩余空间&#xff0c;zabbix 内置了非常多的键值可以选着使用 2、单位B不需要修改&#xff0c;后期图表中单位和G拼接起来就是GB 3、更新时间 10S…

Qt扫盲-QSqlTableModel理论总结

QSqlTableModel理论总结 一、概述二、使用1. 与 view 视图绑定2. 做中间层&#xff0c;不显示 三、常用函数 一、概述 QSqlTableModel是用于从单个表读写数据库记录的高级接口。它构建在较低级的QSqlQuery之上&#xff0c;可用于向QTableView 等视图类提供数据。这个主要是对单…