【图论】——理论基础总结

图论这一章尤其需要图例进行说明,方便理解,对于作者来说很费时间,本文主要为自己复习方便,所以并不会写的非常详细,见谅。

图论

图的基本概念

基本要素:

  • 节点

两点连成线,多个点连成的线称为图。当然也可以就一个节点,或者啥也没有(空图)。

图的种类

方向的概念
根据边有无方向划分为:

  • 无向图
  • 有向图

权重的概念
边可以有权重,根据有无权重和方向:

  • 加权有向图
  • 加权无向图

度的概念

  • 针对无向图,对于某节点,有几条边连着该节点,就称该节点的度为多少
  • 对于有向图,每个节点有出度和入度
    • 出度:从该节点出发的边的个数
    • 入度:进入该节点的边的个数

连通性的概念

无向图中,根据任意两个节点之间能否到达:

  • 连通图:如果任意两个节点都是可以到达的,可以称之为连通图。
  • 非连通图:反之,如果有任意两个节点不能到达,就是非连通图。

有向图中,注意,是任意两个节点都能互相到达,单向的到达不是强连通图!

  • 强连通图:在有向图中,任何两个节点是可以相互到达的,我们称之为 强连通图。

连通分量的概念
在无向图中,极大连通子图称为该图的一个连通分量。这里最重要的概念是 “ 极大 ” ,只有极大的连通子图才是连通分量!

强连通分量
在有向图中,极大强连通图称为该图的强连通分量。
这里,既是“ 极大 ” , 又是“ 强(任意节点双向可到达) ”,才是强连通分量。

图的构造

基本概念搞清楚了,那么如何用代码表示图?
一般包括:邻接表、邻接矩阵或者类

  1. 邻接矩阵(Adjacency Matrix)
    • 对于一个有 n n n 个顶点的图 G = ( V , E ) G=(V,E) G=(V,E),其邻接矩阵是一个 n × n n×n n×n 的矩阵 A A A。如果图是无向图,当顶点 i i i 和顶点 j j j 之间有边相连时, A i j = A j i = 1 A_{ij}=A_{ji}=1 Aij=Aji=1(若为加权图,则为边的权重值),否则为 0;
    • 如果图是有向图,当存在从顶点 i i i 到顶点 j j j 的边时, A i j = 1 A_{ij}=1 Aij=1(或边的权重), A j i A_{ji} Aji 则根据是否有从 j j j i i i 的边来确定。
    • 这种表示方法的优点是判断两个顶点是否相邻很方便,时间复杂度为 O ( 1 ) O(1) O(1)。缺点是对于稀疏图,会浪费大量的存储空间,因为大量的元素为 0。
    • 例如,一个有 1000 个顶点但只有 100 条边的图,邻接矩阵需要存储 1000 × 1000 = 1000000 1000×1000 = 1000000 1000×1000=1000000 个元素,但实际有用的信息很少。

上面的描述有点抽象

  • 简单说,邻接矩阵就是一个二维矩阵(计算机中叫二维数组)来表示图结构,以节点为主体来描述图
  • 有多少节点就申请多大的二维数组
  • 例如: g r i d [ 2 ] [ 5 ] = 6 grid[2][5] = 6 grid[2][5]=6,表示 节点 2 节点 2 节点2 连接 节点 5 节点5 节点5 为有向图,节点2 指向 节点5,边的权值为 6 6 6
  • 如何用邻接矩阵表示无向图呢? g r i d [ 2 ] [ 5 ] = 6 grid[2][5] = 6 grid[2][5]=6 g r i d [ 5 ] [ 2 ] = 6 grid[5][2] = 6 grid[5][2]=6,表示节点2 与 节点5 相互连通,权值为6。

分析邻接矩阵的优缺点:
缺点:

  • 一个有 N N N 个节点的图,需要申请 N 2 N^2 N2 尺寸的二维数组,需要 N 2 N^2 N2 尺寸的空间,显然邻接矩阵这种表达方式容易造成空间浪费,
  • 并且,在寻找节点连接情况的时候,需要遍历整个矩阵,即时间复杂度也相当高,达到了 O ( l o g N 2 ) O (logN^2) O(logN2)

优点:

  • 表达方式简答,易于理解
  • 检查任意两个顶点之间是否存在边的操作非常快
  • 适合稠密图,在边数接近顶点平方数的图中,邻接矩阵是一种空间效率较高的表示方法
  1. 邻接表(Adjacency List)
    • 对于图中的每个顶点,用一个链表(或其他合适的数据结构,如数组等)来存储与它相邻的顶点。
    • 在有向图中,可以分别存储出边邻接表和入边邻接表。这种表示方法对于稀疏图很节省空间,只存储实际存在的边信息。
    • 其优点是存储效率高,尤其是在边数较少的情况下。
    • 缺点是查询两个顶点是否相邻的时间复杂度比邻接矩阵高,需要遍历链表,平均时间复杂度为 O ( d ) O(d) O(d) d d d 为顶点的度)。
    • 例如,在一个社交网络图中,如果用邻接表表示,每个用户的好友列表就是其邻接表,这样可以高效地存储和查询用户之间的关系。

简单说:

  • 邻接表以边为主体,使用数组+链表来表示边的连接情况,有多少边就申请多少对应大小的链表
  • 优点:
    • 对于稀疏图的存储,只需要存储边,空间利用率高
    • 遍历节点连接情况,相对容易
  • 缺点:
    • 检查任意两个节点之间是否存在边,效率相对较低,需要 O ( V ) O(V) O(V)时间,V表示某节点连接其他节点的数量
    • 实现相对复杂,不直观,不易理解

图的遍历方式

  • 深度优先搜索(DFS)
  • 广度优先搜索(BFS)

注意!

  • 二叉树的递归遍历,是dfs在二叉树上的遍历方式
  • 二叉树的层序遍历,是bfs在二叉树上的遍历方式
  1. 深度优先搜索(DFS - Depth - First - Search)

    • 从图中的某个起始顶点 v v v 开始,首先访问顶点 v v v
    • 然后选择一个与 v v v 相邻且未被访问过的顶点 w w w,递归地对 w w w 进行深度优先搜索,直到遇到一个顶点,其所有相邻顶点都已被访问过,然后回溯到上一个有未访问邻接顶点的顶点,继续搜索。
    • 这个过程可以使用栈(递归调用本身就利用了系统栈)来实现。
    • 例如,在一个迷宫图中,可以想象为沿着一条通道一直走,直到走不通了,再返回上一个岔路口选择另一条路。
    • 在实现中,可以使用一个布尔数组来标记顶点是否已被访问。深度优先搜索可以用来判断图是否连通、寻找图的连通分量、生成图的生成树等。
  2. 广度优先搜索(BFS - Breadth - First - Search)

    • 从起始顶点 v v v 开始,首先访问顶点 v v v,然后依次访问 v v v 的所有未被访问过的邻接顶点,接着再依次访问这些邻接顶点的未被访问过的邻接顶点,以此类推,按照层次进行遍历。这个过程可以使用队列来实现。例如,在一个网络拓扑图中,如果从一个节点开始传播信息,BFS 可以模拟信息按照距离逐步传播的过程。
    • 广度优先搜索可以用于计算图中顶点的最短路径(在无权图中,距离就是边的数目)、判断图的连通性等。在实现时,同样需要一个布尔数组来标记顶点是否已被访问,还需要一个队列来存储待访问的顶点。

最短路径算法

  1. 迪杰斯特拉算法(Dijkstra’s Algorithm)

    • 用于计算加权有向图(或加权无向图)中一个顶点到其他所有顶点的最短路径。算法维护一个集合 S S S,表示已经找到最短路径的顶点集合,初始时只包含起始顶点。对于每个顶点 v v v,记录从起始顶点到 v v v 的当前最短距离 d [ v ] d[v] d[v]。在每次迭代中,选择不在 S S S 中且 d [ v ] d[v] d[v] 最小的顶点 u u u,将其加入 S S S,然后更新与 u u u 相邻的顶点的最短距离估计。例如,在一个交通网络中,要找到从一个城市到其他所有城市的最短距离,迪杰斯特拉算法可以通过逐步扩展已确定最短路径的城市集合来计算。
    • 算法的时间复杂度一般为 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2) ∣ V ∣ |V| V 是顶点数),使用合适的数据结构(如优先队列)可以优化到 O ( ∣ E ∣ + ∣ V ∣ l o g ∣ V ∣ ) O(|E| + |V|log|V|) O(E+VlogV) ∣ E ∣ |E| E 是边数)。
  2. 贝尔曼 - 福特算法(Bellman - Ford Algorithm)

    • 可以处理有负权重边的图(但不能有负权重环),用于计算单源最短路径。算法通过对所有边进行多次松弛操作来逐步逼近最短路径。每次迭代,遍历图中的所有边,尝试更新通过该边连接的两个顶点的最短距离。例如,在一些经济模型中,可能会出现负权重的情况,贝尔曼 - 福特算法可以用于分析成本等相关问题。
    • 算法的时间复杂度为 O ( ∣ V ∣ ∣ E ∣ ) O(|V||E|) O(V∣∣E)
  3. 弗洛伊德算法(Floyd - Warshall Algorithm)

    • 用于计算加权图(有向或无向)中所有顶点对之间的最短路径。算法使用动态规划的思想,通过一个二维数组来存储顶点之间的最短距离,逐步更新数组的值。例如,在分析一个大型通信网络中任意两个节点之间的最短通信路径时,弗洛伊德算法可以一次性计算出所有的最短路径信息。
    • 算法的时间复杂度为 O ( ∣ V ∣ 3 ) O(|V|^3) O(V3)

生成树

  1. 生成树的定义

    • 对于一个连通图 G = ( V , E ) G=(V,E) G=(V,E),生成树是 G G G 的一个子图 T = ( V , E ′ ) T=(V,E') T=(V,E),其中 E ′ ⊆ E E'\subseteq E EE,且 T T T 是一棵树(即无环且连通),包含图 G G G 的所有顶点。例如,在一个电网图中,生成树可以表示一种最小的电线连接方式,使得所有节点都能有电且没有多余的回路。
  2. 最小生成树(MST - Minimum Spanning Tree)

    • 在加权连通图中,所有生成树中边的权重之和最小的生成树称为最小生成树。常见的计算最小生成树的算法有:
    • 普里姆算法(Prim’s Algorithm):从任意一个顶点开始,每次选择一个与当前生成树相连且边权重最小的顶点,将其加入生成树,直到所有顶点都被包含。算法时间复杂度一般为 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2),使用合适的数据结构可以优化到 O ( ∣ E ∣ + ∣ V ∣ l o g ∣ V ∣ ) O(|E| + |V|log|V|) O(E+VlogV)
    • 克鲁斯卡尔算法(Kruskal’s Algorithm):将图中的所有边按照权重从小到大排序,然后依次选择边,如果选择的边不会形成环,则将其加入生成树,直到生成树包含 n − 1 n - 1 n1 条边( n n n 是顶点数)。算法时间复杂度主要取决于边的排序,一般为 O ( ∣ E ∣ l o g ∣ E ∣ ) O(|E|log|E|) O(ElogE)。最小生成树在网络设计、电路布线等领域有广泛应用。

拓扑排序

  1. 拓扑排序的定义

    • 对于一个有向无环图(DAG - Directed Acyclic Graph),拓扑排序是将图中所有顶点排成一个线性序列,使得对于图中的任意一条有向边 ( u , v ) (u,v) (u,v),顶点 u u u 在序列中都排在顶点 v v v 的前面。例如,在一个课程学习的先后顺序图中,拓扑排序可以表示课程的学习顺序,先修课程排在前面,后修课程排在后面。
  2. 拓扑排序算法

    • 一种常见的方法是使用深度优先搜索。在 DFS 遍历过程中,当一个顶点的所有后继顶点都被访问完后,将该顶点加入拓扑排序序列。也可以使用入度表的方法,不断删除入度为 0 的顶点,并更新其邻接顶点的入度,直到所有顶点都被处理。拓扑排序在任务调度、项目规划等领域有重要应用,用于确定任务的执行顺序。

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

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

相关文章

printf影响单片机中断速度

printf是我们常用的调试程序的手段,在第一版程序中,经常会使用printf来验证程序是否工作正确。这样的调试手段应该在正式版的程序发布前注释掉或者删除。而且不当地使用printf也会带来某些功能性问题,例如,在某项目中,…

mysql error:1449权限问题 及 用户授权

一、权限问题 Got error: 1449: The user specified as a definer (skip-grants userskip-grants host) does not exist when using LOCK TABLES 在迁移数据库时,定义的definer,在两个数据库之间不同步时,要将不存在的definer改成数据库中已…

HTB:Grandpa[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which version of Microsoft IIS is running on TCP port 80? 2.Which 2017 CVE abuses a Buffer overflow in the ScStoragePathFromUrl function in that specific IIS version, allowing remote attackers to execute arbitrary code?…

AI笔筒操作说明及应用场景

AI笔筒由来: 在快节奏的现代办公环境中,我们一直在寻找既能提升效率、增添便利,又能融入企业文化、展现个人品味的桌面伙伴。为此,我们特推出专为追求卓越、注重细节的您设计的AI笔筒礼品版,它集高科技与实用性于一身…

ssm+vue684基于WEB技术的在线商品交易平台的设计

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

【青牛科技】GC8549替代LV8549/ONSEMI在摇头机、舞台灯、打印机和白色家电等产品上的应用分析

引言 在现代电子产品中,控制芯片的性能直接影响到设备的功能和用户体验。摇头机、舞台灯、打印机和白色家电等领域对控制精度、功耗和成本等方面的要求日益提高。LV8549/ONSEMI等国际品牌的芯片曾是这些产品的主要选择,但随着国内半导体技术的进步&…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-15

文件下载与邀请翻译者 学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么&#xff…

C语言---程序设计基础练习题目3

对之前的练习和文章进行回顾,并在此文章中解决新问题 如在题目中有看不明白的地方 可跳转我的主页去查看 Wanyu的主页 以下题目是留在文章中的练习:(点击即可查看) Wanyu C语言—程序设计练习题目及学习方法2 习题1:…

[SAP ABAP] 面向对象程序设计-类和对象

面向对象开发的特点:封装、继承和多态 什么是类和对象? 类(CLASS)是创建对象的模板,对象(OBJECT)是类的实例 一个类可以创建多个对象 类 > 类型 对象 > 个体 在ABAP语言中,定义一个类,需要包含定义(defin…

实验05多重循环---7-04 小于m的最大的10个素数

给定一个整数m&#xff08;50<m<20000&#xff09;&#xff0c;找出小于m的最大的10个素数。 输入格式: 输入在一行中给出一个正整数m&#xff08;50<m<20000&#xff09;。 输出格式: 在一行中按递减顺序输出10个满足条件的素数&#xff0c;每个素数输出占6列。…

模型 泰斯勒定律(复杂性守恒定律)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。复杂性守恒&#xff0c;转移而非消除。 1 泰斯勒定律的应用 1.1 电视遥控器的复杂性转移 在过去&#xff0c;电视遥控器设计得非常复杂&#xff0c;拥有许多按钮和功能&#xff0c;这使得用户在使用…

前端注释都应该怎么写?

以下是一些前端注释的例子&#xff0c;展示了如何应用前面提到的建议&#xff1a; 1. 使用清晰、简洁的语言 // 计算两个数的平均值 function calculateAverage(a, b) {return (a b) / 2; }2. 描述代码的目的和功能 // 将日期格式化为 "YYYY-MM-DD" 的字符串 fun…

KubeSphere v4 扩展组件使用指南

KubeSphere v4 扩展组件使用指南 日前&#xff0c;KubeSphere v4 发布&#xff0c;相较于之前的版本&#xff0c;新版本在架构上有了较大的变化。其中&#xff0c;有一个新的概念——扩展组件。 本文我们将针对扩展组件做一个详细的说明&#xff0c;让大家对扩展组件能够了解…

后端-内连接(INNER JOIN),左外连接(LEFT JOIN)和右外连接(RIGHT JOIN)的区别

SQL 语句中的 内连接、外连接、左连接 和 右连接 是常见的用于联合多张表的数据查询方式。它们的区别主要体现在如何处理在连接的表中没有匹配数据的记录。 1. 内连接&#xff08;INNER JOIN&#xff09; 内连接是最常见的一种连接方式&#xff0c;它返回两个表中满足连接条件…

【Orange Pi 设备】window11主机下使用VNC可视化控制RK3566

【Orange Pi 设备】window11主机下使用VNC可视化控制RK3566 前言VNC连接搭建(WiFi模式)Orange Pi 3B操作本地主机操作 总结 XFCE桌面VNC连接后灰屏问题&#xff0c;可以优先尝试本文的方式 前言 Orange Pi 3B 是一款基于瑞芯微 RK3566 处理器的单板计算机&#xff0c;旨在为开…

Go 语言的函数调用

1. 引言 Go 语言的函数调用是其核心特性之一,Go 的函数调用方式既简洁又强大。理解 Go 语言中的函数调用机制不仅有助于编写更高效的代码,也能帮助开发者深入了解 Go 的并发模型和内存管理。 在这篇博客中,我们将详细探讨 Go 语言的函数调用机制,了解函数的声明、调用、参…

【VUE+DRF】案例升级

1、功能完善&#xff08;简易版&#xff09; 1.1 后端API校验 基于drf的认证组件实现只有登录之后才能查看 utils/auth.py from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import APIException, AuthenticationFailed from…

背靠背MOS管-锂电池充放电控制详解

目录&#xff1a; 1、概述 2、外接适配器 3、使用锂电池 4、电池检测回路 1、概述 本锂电池充放电控制电路采用 TP4055 作为电池 BAT 的充电控制&#xff0c;如下图1.1绿色框所示。 TP4055 引脚功能描述&#xff1a; 1CHRG开漏输出的充电状态指示引脚&#xff0c;需要上…

嵌入式软件八股文

1.指针的大小是固定的&#xff0c;和指针的类型没有关系 只与编译器有关&#xff0c;32位系统指针大小为8个字节&#xff0c;x64一般为64位系统&#xff0c;指针大小一般为4个字节。 2.sizeof()和strlen() sizeof()计算所占内存的大小,可以计算int float大小 strlen()计算的…

美畅物联丨物联网通信新纪元:Cat.1与5G RedCap的差异化应用

​ 在物联网&#xff08;IoT&#xff09;迅猛发展的时代&#xff0c;通信标准对物联网设备的连接性、性能和适用性有着极为关键的作用。小编在《美畅物联丨Cat.1与NB-IoT&#xff1a;物联网设备的通信标准对比》中提到Cat.1与NB-IoT的对比区别&#xff0c;后来就有小伙伴问&…