数据结构与算法--图的存储与遍历

news2024/9/23 11:18:53

文章目录

      • 回顾
      • 提要
      • 图的定义和表示
      • 图的表示
        • 完全图和子图
        • 顶点的度
        • 路径与回路
        • 连通图
      • 邻接矩阵
        • 权和网
      • 邻接表
        • 示例
      • 深度优先遍历 (DFS)
      • 广度优先遍历 (BFS)
      • 广度优先遍历过程
      • 总结
      • 邻接矩阵存储结构
      • 邻接表存储结构

回顾

  • 线索化二叉树:在某种次序遍历过程中创建线索,将空指针指向遍历序列中的前驱或后继结点。
  • 线索二叉树:经过线索化处理的二叉树。
  • 哈夫曼树(最优二叉树):带权路径长度WPL最小的二叉树。

提要

  • 图的定义和表示。
  • 图的相关概念。
  • 图的存储结构与实现。
  • 图的遍历方法。

图的定义和表示

G由顶点集合V和边集合E组成,记为G = (V, E)

  • V是顶点元素的有限集合,

  • E是顶点间关系——边的有限集合。

  • (边是顶点的无序对或有序对)
    在这里插入图片描述

  • 无向图:边没有方向,由顶点的无序对组成。

    • 在这里插入图片描述

    • 由没有方向的边构成的图。

    • 无向图中的边由顶点的无序对组成。(用圆括号表示)

    • 邻接点:无向图中,若存在一条边(Vi, Vj),则称Vi和Vj互为邻接点。

    • 右图中的边是无方向的,

    • 即 (V1, V2) 和 (V2, V1)

    • 表示同一条边。

    • 在这里插入图片描述

  • 有向图:边有方向,由顶点的有序对组成,称为弧。

    • 在这里插入图片描述

    • 由有方向的边构成的图。

    • 弧:有向图中的边由顶点的有序对组成,也称作弧。(用尖括号表示)

    • 有向图中,顶点的有序对<Vi, Vj>表示从Vi指向Vj的一条有向边,其中Vi是起点,Vj是终点。

    • 右图中的边是有方向的,

    • <V1, V2> 和 <V2, V1>

    • 表示两条不同的边。

    • 在这里插入图片描述

图的表示

  • 邻接矩阵:使用二维数组表示,其中matrix[i][j]表示顶点i到顶点j的边的信息。
  • 邻接表:使用链式存储结构,包含顶点表和边表。
  • 在这里插入图片描述
完全图和子图

子图:对于图G=(V,E)和图G´=(V´,E´),若存在V´  V且E´  E,则称图G´是图G的子图。
在这里插入图片描述
在这里插入图片描述

顶点的度

无向图中,顶点的度指与每个顶点相连的边数。
有向图中,顶点的度分成入度与出度。
入度:以该顶点为终点的弧的数目
出度:以该顶点为起点的弧的数目
在这里插入图片描述

路径与回路

在这里插入图片描述
在这里插入图片描述

连通图

在这里插入图片描述
在这里插入图片描述

邻接矩阵

在这里插入图片描述

有向图和无向图的邻接矩阵表示方法。
在这里插入图片描述

权和网

在这里插入图片描述
在这里插入图片描述

邻接表

  • 顶点表:存放图中每个顶点的信息及指向边表的头指针。由顶点表和边表组成,是链式存储结构。

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 顶点表:存放图中每个顶点的信息以及指向该顶点边表的头指针。顶点表通常采用顺序存储结构。

    • 顶点表的结点结构:
    • 顶点域data存放顶点信息,head为边表头指针。
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 边表:为图中每个顶点建立的单链表,存放相邻接的邻接点。

    • 边表的结点结构:在这里插入图片描述

    • 邻接点域adjVex存放邻接点在顶点表中的序号,next为指向下一个邻接点的指针。

    • 在这里插入图片描述
      在这里插入图片描述

示例

在这里插入图片描述
在这里插入图片描述

  • 逆邻接表:结构与邻接表完全相同,只是边表中每个结点存放的是每条弧的弧尾顶点。
  • 在这里插入图片描述

深度优先遍历 (DFS)

遍历过程:

  1. 从任一顶点出发,访问此顶点。
  2. 选择一个未访问的邻接点,再从w出发进行深度优先遍历(递归),直至图中所有和v连通的顶点都被访问过为止;
  3. 访问所有连通顶点后,若存在未访问顶点,重复以上步骤。直至图中所有顶点都被访问为止。
    在这里插入图片描述
    示例:深度优先遍历无向图在这里插入图片描述
    示例:深度优先遍历有向图
    在这里插入图片描述

广度优先遍历 (BFS)

遍历过程:

  1. 从任一顶点出发,访问此顶点。
  2. 访问所有未访问的邻接点,然后是它们的邻接点,依此类推。
  3. 若存在未访问顶点,则另选图中一个未被访问的顶点作起点,重复以上步骤。
    在这里插入图片描述
    示例:广度优先遍历无向图
    在这里插入图片描述
    示例:广度优先遍历有向图
    在这里插入图片描述

广度优先遍历过程

使用队列完成广度优先遍历。
在这里插入图片描述

总结

  • 图的结构特点。
  • 图与线性表和树的区别。
  • 图的两种存储结构:邻接矩阵和邻接表。
  • 图的两种遍历方法:深度优先和广度优先。

以下是代码示例,展示如何使用C++实现图的邻接矩阵和邻接表存储结构,以及深度优先遍历和广度优先遍历的算法。

邻接矩阵存储结构

#include <iostream>
#include <vector>

const int MAX_V = 100;  // 假设顶点数不超过100

void dfs(int v, std::vector<std::vector<int>>& graph, std::vector<bool>& visited) {
    visited[v] = true;
    std::cout << v << " ";  // 访问顶点

    // 遍历所有邻接顶点
    for (int i = 0; i < graph[v].size(); ++i) {
        int nextV = graph[v][i];
        if (!visited[nextV]) {
            dfs(nextV, graph, visited);
        }
    }
}

int main() {
    std::vector<std::vector<int>> graph = {
        {1, 2},
        {0, 3},
        {0, 4},
        {0},
        {1}
    };
    std::vector<bool> visited(MAX_V, false);

    dfs(0, graph, visited);  // 从顶点0开始深度优先遍历
    return 0;
}

邻接表存储结构

struct AdjListNode {
    int dest;
    AdjListNode* next;
};

struct AdjList {
    AdjListNode* head;
};

struct Graph {
    int numVertices;
    AdjList* arrays;
};

void addEdge(Graph* graph, int src, int dest) {
    AdjListNode* newNode = new AdjListNode{dest, graph->arrays[src].head};
    graph->arrays[src].head = newNode;
}

void dfs(Graph* graph, int v, std::vector<bool>& visited) {
    visited[v] = true;
    std::cout << v << " ";  // 访问顶点

    AdjListNode* node = graph->arrays[v].head;
    while (node) {
        int nextV = node->dest;
        if (!visited[nextV]) {
            dfs(graph, nextV, visited);
        }
        node = node->next;
    }
}

// 广度优先遍历使用队列的示例
void bfs(Graph* graph, int start, std::vector<bool>& visited) {
    std::queue<int> queue;
    visited[start] = true;
    queue.push(start);

    while (!queue.empty()) {
        int v = queue.front();
        queue.pop();
        std::cout << v << " ";  // 访问顶点

        AdjListNode* node = graph->arrays[v].head;
        while (node) {
            int nextV = node->dest;
            if (!visited[nextV]) {
                visited[nextV] = true;
                queue.push(nextV);
            }
            node = node->next;
        }
    }
}

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

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

相关文章

简单数学运算(c语言)

1.描述 //牛牛最近学会了一些简单的数学运算&#xff0c;例如 //∑i1 ∑i 1 //请你帮他模拟一下这个运算。 &#xff08;即 1 2 3.... n - 1 n) //输入描述&#xff1a; //输入仅一个正整数 n //输出描述&#xff1a; //请你计算 //∑i1n 2.就是递归函数 方法一&#xf…

40.【C语言】指针(重难点)(E)

目录 13.指针的使用和传址调用 14.数组名的理解 *数组名就是数组首元素的地址 *两个例外 *使用指针访问数组 *一维数组的传参本质 往期推荐 承接上篇39.【C语言】指针&#xff08;重难点&#xff09;&#xff08;D&#xff09; 13. 指针的使用和传址调用 见29.【C语言】函数系…

Linux系统编程(9)

一、wait函数 1.wait函数 #include <sys/wait.h> pid_t wait(int *status);wait函数有两个作用&#xff1a; 1.获取子进程 的退出状态 当父进程要获取子进程的退出状态时&#xff0c;子进程里需要使用exit函数&#xff08;exit&#xff08;退出状态值&#xff09;退出…

10:【stm32】USART与串口通信一:USART(上)

USART&#xff08;上&#xff09; 1、串口通信1.1、简介1.2、数据帧1.2.1、简介1.2.2、校验规则1.2.3、停止位的长度 1.3、异步通信的波特率1.3.1、同步通信1.3.2、异步通信1.3.3、硬件流控 2、USART2.1、简介2.2、工作的原理2.3、相关寄存器 3、标准库编程3.1、编程接口USART_…

day16-测试自动化之selenium的PO模式

一、PO模式介绍 PO&#xff08;Page Object&#xff09;模式是一种在自动化测试中常用的设计模式&#xff0c;将页面的每个元素封装成一个对象&#xff0c;通过操作对象来进行页面的交互。 一般分为六个版本&#xff0c;现在大部分企业都用的V4版本&#xff0c;三层结构…

redis面试(十六)公平锁释放和排队加锁

锁释放 RedissonFairLock.unlockInnerAsync()方法 这和加锁的逻辑没有太大区别 也就是说在客户端A他释放锁的时候&#xff0c;也会走while true的脚本逻辑&#xff0c;看一下有序集合中的元素的timeout时间如果小于了当前时间&#xff0c;就认为他的那个排队就过期了&#xf…

Spring自动注册-<bean>标签和属性解析

xml文件中最常见也最核心的就是<bean>,<Import>,<beans>,<alias>标签,关于它们的解析主要是BeanDefinitionParserDelegate类中.<bean>标签的解析最为复杂和重要. <bean>标签 processBeanDefinition(ele, delegate)方法中,主要是是对…

数据库管理-Redis

数据库管理-Redis 一、关系型数据库和非关系型数据库1、关系型数据库&#xff08;Relational Database Management System, RDBMS&#xff09;&#xff1a;2、非关系型数据库&#xff08;NoSQL Database Management System&#xff09;&#xff1a; 二、redis简述 redis是把数据…

苦WPS云盘已久矣

主要因为软件更新后&#xff0c;设置位置都会跑到其他地方 打开wps客户端后&#xff0c;点击电脑底部任务栏的云朵图标。 2. 找到存储位置后&#xff0c;点击“更换位置”。 来自https://www.wps.cn/mlearning/question/detail/id/333165.html

Java | Leetcode Java题解之第328题奇偶链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode oddEvenList(ListNode head) {if (head null) {return head;}ListNode evenHead head.next;ListNode odd head, even evenHead;while (even ! null && even.next ! null) {odd.next even.nex…

编程学习笔记秘籍:开启高效学习之旅

引言&#xff1a; “计算机科学教育不能使人成为程序员&#xff0c;就像学画笔和颜料不能使人成为画家一样。”——埃里克雷蒙德。在当今数字化的时代&#xff0c;编程如同一把神奇的钥匙&#xff0c;能够打开无数机遇的大门。然而&#xff0c;编程知识的海洋广阔无垠&#xff…

正也科技:医药营销管理数字化建设的重要性及其迭代方向

第三届MAH合作与创新大会暨浙江省医药产业博览会于上周在杭州圆满结束。会议汇集了众多医药领域的专家、行业领袖和企业家&#xff0c;共同探讨医药行业的转型之路与实战经验。在中国医药新趋势分论坛&#xff0c;与会人员重点讨论了当前中国医药产业在新环境下所面临的挑战、变…

文心快码 Baidu Comate 前端工程师观点分享:行业现状(二)

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…

Hackademic.RTB1靶机复现

查看靶机的MAC地址 使用nmap进行扫描 使用dirsearch进行目录扫描 网站登录 点击紫色字体 进一步进行目录扫描 进行拼接 拼接wp-content 拼接wp-includes 点击Got root 测试发现不存在SQL注入 点击posted in Uncategorized 测试发现存在SQL注入 测试数据库 python sqlmap.py…

Linux-Shell三剑客grep,awk,sed-08

awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;其中属awk功能最强大&#xff0c;但也最复杂。grep更适合单纯的查找或匹配文本&#xff0c;sed…

UDP通信如何测试使用

用户数据报协议(User Datagram Protocol,UDP)是一种无连接的传输层通信协议,用于互联网应用程序。与TCP(传输控制协议)不同,UDP提供了较少的服务并且不保证数据的可靠传输,但它以更少的系统资源消耗和更低的延迟作为交换,这使得UDP非常适合那些对速度要求高而对数据丢…

【LLM之RAG】GraphRAG论文阅读笔记

研究背景 本文探讨了大型语言模型&#xff08;LLM&#xff09;如何通过从外部知识源检索相关信息来回答关于私有或之前未见过的文档集合的问题。特别指出&#xff0c;传统的检索增强生成&#xff08;RAG&#xff09;系统在处理全局问题时存在局限性&#xff0c;例如问整个文本…

四种应用层协议——MQTT、CoAP、WebSockets和HTTP——在工业物联网监控系统中的性能比较

目录 摘要(Abstract) 实验设置 实验结果 节选自《A Comparative Analysis of Application Layer Protocols within an Industrial Internet of Things Monitoring System》&#xff0c;作者是 Jurgen Aquilina、Peter Albert Xuereb、Emmanuel Francalanza、Jasmine Mallia …

java计算机毕设课设—CRM客户关系管理系统((附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; java计算机毕设课设—CRM客户关系管理系统&#xff08;(附源码、文章、相关截图、部署视频) CRM客户关系管理系统是一种基于Java开发的系统&#xff0c;旨在帮助企业更有效地管理与客户的互动。该系统通过优化客户信息的组织和分析&#xff0c;增强…

【Electron】npm安装Electron项目失败报错问题和解决办法

前言 闲来无事&#xff0c;便想着研究一下Electron&#xff0c;没想到安装直接就卡住了 问题 npm ERR! RequestError: Hostname/IP does not match certificates altnames: Host: npm.taobao.org. is not in the certs altnames: DNS:*.tbcdn.cn, DNS:*.taobao.com, DNS:*.al…