【算法4总结】第四章:图

article/2025/8/6 10:51:19
  • 目录
  • 备份

第四章:图

概述

图可以根据是否有向带权分成以下四种:

  • 无向图 (无向不带权)
  • 有向图 (有向不带权)
  • 加权无向图(无向带权)
  • 加权有向图(有向带权)

无向图

无向图定义: 由一组顶点和一组能够将两个顶点链接在一起的边组成。

特殊情况下的图: 自环,平行边。

自环:就是自己连自己。

平行边:同一对顶点上有多条边相连。例如就像家和学校两个点之间存在很多条路可以选择,而路与路之间称为平行边。

术语

图论方面存在很多相关术语,为了便于后续的叙述,先将这些术语罗列出来。

  • 相邻:两个顶点和同一条边相连称为相邻。同时也称这条边依附与这两个顶点。
  • 顶点的度:与该顶点相邻边的个数。
  • 子图:一幅图中所有边的子集以及这些边相关的点所组成的图。
  • 路径:边顺序连接起来的一系列的顶点。
  • 简单路径:没有重复顶点的路径。
  • 环:至少含有一条起点和终点相同的路径。
  • 简单环:不含有重复顶点和边的环。
  • 连通图:任意一个顶点都存在一条路径到达另一个任意顶点。
  • 极大连通子图:非连通图是由若干个连通子图组成,这些连通子图称为极大连通子图。
  • 连通分量:极大连通子图的个数称为非连通图的连通分量。
  • 树:无环连通图
  • 森林:互不相连的组成森林
  • 生成树:连通图子图,含有图中的所有顶点并且还得是一棵
  • 生成森林:生成树的集合,也就是该图的所有连通子图生成树的集合。
  • 稀疏图:被连接的顶点对很少,也就是边比较少的图。
  • 稠密图:大部分的顶点对都有边相连,只有少部分的顶点对之间没有边连接。
  • 二分图:顶点集可以分割成两个互不相交的子集。

无向图的表示方法

构建无向图需要满足两个条件:

  1. 为各种类型的图预留足够的空间。
  2. 处理时速度要快。

存在三种类型的实现方法:

  1. 邻接矩阵,二维的布尔矩阵,两点 i 和 j 之间存在边则对应的下标 [i][j] 中的值为 true ,反之为 false 。当图很大时所需的空间也很大,无法满足第一个条件。

  2. 边的数组,实现一个 Edge 类,里面设置两个 int 实例变量。这种实现虽然简洁,但是处理慢,例如如果想要得到某个结点的所有边需要遍历全部结点。

  3. 邻接表数组,以顶点为索引,其中的元素都是与该顶点相邻的结点。如图:

邻接表的数据结构

在非稠密图中就是采用邻接表的数据结构实现的。每个顶点相邻顶点的元素都保存在该顶点对应的元素所指向的一张链表中。

对于 V 个顶点 E 条边的图,使用的空间为 V + E V+E V+E , 添加一条边所消耗的时间为常数。处理相邻顶点所需的时间也为常数。

深度优先搜索

搜索的本质是遍历全部节点,深搜就是一种遍历方式,如图:

特点是每次都遍历到尽头,也就是走不下去的时候回头再遍历相关节点。

广度优先搜索

广搜和深搜相反,优先遍历相关节点,相关节点都遍历完成后再去遍历下一层的节点指导走到尽头。

有向图

有向图的边是单向的,每条边连接的两个顶点都是一个有序对。

背景: 有向图的背景有很多,简单枚举几个,有一个大致的体会。

  1. 食物链物种的间的不是关系是单向的。
  2. 网页之间的超链接,往往有去无回。
  3. 程序间的模块间的外部引用。

有向图有顶点和有方向的边组成。

有向图中的分为出度入度两种类型。出度为该顶点指出的边的总数,入度则为指向该顶点的边的总数。

在一条有向边中,第一个顶点称为,而第二个顶点则称为

多点可达性可以应用于垃圾回收,顶点代表对象,而顶点之间的边代表对象与对象之间的引用

最小生成树

生成树表示含有所有顶点的无环连通子图。

而最小生成树表示在生成树的基础上权重最小。

最小生成树只考虑连通图。

边的权重不一定表示距离。

原理

  • 用一条边连接树中任意两个顶点都会产生一个新的环。
  • 从树中删去一条边将会得到两颗独立的树。

切分定理:指将图中所有顶点分为两个非空且不重叠的两个集合,横切边是一条连接两个属于不同集合的顶点的边。

从横切边中找权重最小的边,这条边一定属于最小生成树中。依次不断寻找权重最小的横切边即可。

Prim 算法

N 个顶点的图中,需要添加 N-1 条边才能构成最小生成树。

对于 prim 算法而言,每次都需要选择一条最小的横切边加入树中。

prim 算法也分为即使实现和延时实现,前者表示一条边的两个顶点都存在于树中的话将会立即删除,反之则不删除等待后续检查边的有效性。

延时实现的遍历顺序为:

即时实现的遍历顺序为:

二者的区别在于即使实现会将某些边从优先队列中删去,这些边是新加入树中顶点与其他已经在书中顶点的所有边。

Kruskal 算法

这个算法比较简单,将所有的边按照权重排序,依次放入图中即可,注意要将不满足条件的边剔除,例如闭环。

最短路径

最短路径的现实背景就是两地之间存在多条路线,选择一条长度最短的路径。

单点最短路径:在加权有向图中,从顶点 s 到顶点 t 的最短路径是所有从 s 到 t 的路径中的权重最小者。

最短路径性质

最短路径的定义:

  • 路径是有向的。
  • 权重不等价于距离。
  • 并不是所有的顶点都是可达的。
  • 负权重会使问题更复杂。
  • 最短路径一般都是简单的。(忽略环)
  • 最短路径不一定是唯一的。
  • 可能存在平行边和自环。

注意,最短路径树和最小生成树不同,最短路径树是指从指定顶点出发,计算该顶点到达其他所有顶点的最短路径所构成的树。

Dijkstra

Dijkstra 用于处理权重非负的最短路径问题。

Prim 算法每次拿到的都是权值最小的横切边,而 Dijkstra 算法选择横切边是按照距离起点最近的距离来选择,也就是哪个顶点距离起点最近就选择该顶点相关的横切边。


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

相关文章

算法4(一、递归学习)

每次用递归都感觉有点难,这个趁着恶补基础知识的时候,专门看了一遍递归,算法4的。 1.1 递归介绍 方法可以调用自己,例如:下面给出了bin_search的二分查找的一种实现。(算法4中使用的是Java,但…

【算法4总结】第一章:基础

目录备份 第一章:基础 我认为这一章主要介绍的是如何使用工具。 一共五节,前两节主要是对 Java 语法的回顾,第三节则是三个数据结构,背包,队列和栈的API讲解。 而第四节是讲解的是如何分析算法。第五节则是针对具体…

SQL修改语句

如果我们要修改数据库中表的数据&#xff0c;这个时候我们就要使用到UPDATE语句。 UPDATE语句的基本语法是&#xff1a; UPDATE <表名> SET 字段1值1, 字段2值2, ... WHERE ...; 例如&#xff0c;我们想更新employees表id100的记录的last_name和salary这两个字段&…

【数据库】SQL语句之修改语句(INSERT,UPDATE,DELETE)

1.INSERT INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...); 例如&#xff1a; 一次插入一个 INSERT INTO students (class_id, name, gender, score) VALUES (2, 小明, M, 80);一次插入多条 INSERT INTO students (class_id, name, gender, score) VA…

SQL Server修改数据

本篇主要讲解的是SQL Server 中修改数据的几种语句&#xff1a; INSERT语句INSERT INTO SELECT语句UPDATE语句DELETE语句 一&#xff1a;INSERT语句 INSERT语句向表中添加新行&#xff0c;以下是INSERT语句的最基本形式&#xff1a; 首先&#xff1a;table_name指定要插入的…

使用SQL语句修改表数据

使用SQL语句修改表数据 文章目录 使用SQL语句修改表数据利用INSERT语句输入数据利用UPDATE语句更新表数据利用DELETE语句删除表中数据利用Truncate Table语句删除表中数据 利用INSERT语句输入数据 INSERT语句的基本语法格式如下&#xff1a; 上述格式主要参数说明如下&#xf…

初探POC编写

文章目录 前言什么是POC什么是 ExpPOC注意事项尝试编写第一个POCpikachu sql盲注poc参考 前言 想锻炼一下编程能力&#xff0c;师兄说以后很重要的&#xff0c;最好学好一点 但是我又想学习安全相关的&#xff0c;那就来练练poc吧 什么是POC PoC(全称: Proof of Concept), …

POC_MeterSphere-RCE

MeterSphere-RCE 漏洞详情影响范围指纹- fingerPOC-YAML《飞致云MeterSphere开源测试平台远程代码执行漏洞》 漏洞详情 MeterSphere一站式开源持续测试平台存在的远程代码执行漏洞。由于自定义插件功能处存在缺陷,未经身份验证的攻击者可利用该漏洞在目标系统上远程执行任意…

【POC---概念验证】

文章目录 前言一、Proof of Concept是什么&#xff1f;验证内容 PoC测试工作准备前提PoC测试工作参与者PoC测试工作准备文档PoC测试工作第一阶段 工作启动第二阶段 产品宣讲及现场集中测试第三阶段 技术测评第四阶段 间歇性测试工作 第五阶段 商务验证第六阶段 背书归档、分析总…

POC_Jenkins

简介 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成,Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工…

网络安全中的POC、EXP、Payload、ShellCode_网络安全payload是什么意思

什么是 POC、EXP、Payload&#xff1f; POC&#xff1a;概念证明&#xff0c;即概念验证&#xff08;英语&#xff1a;Proof of concept&#xff0c;简称POC&#xff09;是对某些想法的一个较短而不完整的实现&#xff0c;以证明其可行性&#xff0c;示范其原理&#xff0c;其…

Zendstudio 9.0.2 安装Aptana3 并且配置 jQuery

原文地址:http://my.oschina.net/feek/blog/64517 aptana-javascript-jquery.ruble文件夹下载地址: http://dl.dbank.com/c04bfgbchz 一直在用zenstudio9&#xff0c;有时候又需要用到jquery等插件辅助制作前台效果&#xff0c;想安装个Aptana3插件&#xff0c;但是查了好多网…

elfk

1. 2. ​​​​​​​ 3. 4. 5.

c/c++读写文件(c方法篇)

读写文件操作 C语言方法 参考博客&#xff1a;函数基本介绍&#xff1a; https://www.cnblogs.com/lidabo/p/6813354.html 自己写了个demo测试一下fopen、feek、fwrite、fread函数的使用&#xff0c;代码如下&#xff1a; void OperationFile_C() {FILE* fp NULL;fp fopen(…

EFLFK

目录 zookeeper概述 zookeeper 定义 Zookeeper工作机制 Zookeeper特点 Zookeeper数据结构 Zookeeper 应用场景 Zookeeper选举机制 第一次启动选举机制 非第一次启动选举机制 部署 Zookeeper 集群 准备 3 台服务器做 Zookeeper 集群 安装前准备 关闭防火墙 安装 J…

fseek函数c语言_使用示例的C语言中的fseek()函数

fseek函数c语言 C中的fseek()函数 (fseek() function in C) Prototype: 原型&#xff1a; int feek(FILE *stream, long int offset, int origin);Parameters: 参数&#xff1a; FILE *stream, long int offset, int originReturn type: int 返回类型&#xff1a; int Use o…

c语言feek函数读取中文出现乱码

c语言feek函数读取中文出现乱码 在文件操作的学习中,发现读取文件的中文时会出现乱码 当输入的文字改成英文时则不会出现乱码,于是猜想是否和中文与英文占用的字节有关系,实践得出结论,的确是字节搞的鬼,那么有趣了,如果恰好文件指针指向中文字节的一半时,这个指针指向…

vue element-ui自定义表头,动态添加表头,新增行、新增列、删除行、删除列

vue element-ui表格怎样自定义表头&#xff0c;动态添加表头&#xff0c;新增行、新增列、删除行、删除列 需求描述1.自定义表头&#xff0c;表头里插入输入框2.默认初始化几行几列占位3.新增行4.新增列5.右键点击行&#xff0c;进行删除行6.右键点击表头&#xff0c;进行删除列…

sql delete删除列_现有表操作中SQL DELETE列概述

sql delete删除列 In this article, we will explore the process of SQL Delete column from an existing table. We will also understand the impact of removing a column with defined constraints and objects on it. 在本文中,我们将探讨从现有表中删除SQL列的过程。 …

Notepad++快速删除列或者列位置增加相同内容

一、快速删除列(一列或者多列) 方法&#xff1a;鼠标选择范围的起始位置&#xff0c;按住AltShift&#xff0c;然后鼠标选择范围的结束位置 使用‘BackSpace’删除即可 二、快速增加列内容 方法&#xff1a;鼠标放在第一行某一列&#xff0c;按住AltShift&#xff0c;然后鼠…