算法之图论

定义

图通常以一个二元组 G=<V, E>表示,V表示节点集,E表示边集。节点集中元素的个数,称为图的阶。

若图G中的每条边都是没有方向的,称为无向图;每条边是由两个节点组成的无序对,例如节点V1和节点V2之间的边,记为(V1, V2)
![无向图](https://img-blog.csdnimg.cn/7a120abfeaac447681c3d703b3251f06.jpeg#pic_center无向图
若图G中的每条边都是有方向的,称为有向图;有向边也称为弧,每条弧是有两个节点组成的有序对,例如节点V1和节点V2之间的弧,记为<V1, V2>
有向图

定理

握手定理:所有节点的度数之和等于边数的两倍。

存储

邻接表是图的一种链式存储结构,包括两部分:节点和邻接点。
邻接点结构

struct LinkNode {
    int nodeIndex; // 节点下标
    // int weight; // 路径上有不同权重,可以使用
    LinkNode *next; // 下一个邻接点
};

节点

struct Node {
    char ch; // 节点名称,假定为单字符
    LinkNode *first; // 第一个邻接点
}

节点数组

Node nodes[26]; // 26个字符

示例:
有如下图:
示例图
邻接表结构:
邻接表

图的搜索

广度优先搜索

广度优先搜索(Breadth First Search, BFS),又称为宽度优先搜索。即从某个节点(源点)出发,优先访问该节点的所有未被访问的邻接点,再依次从这些被访问的点出发,一层一层的访问,直到访问节点均已访问。如存储的示例图,访问顺序如下
广度优先搜索

深度优先搜索

深度优先搜索(Depth First Search, DFS)。即优先沿着一条路径搜索,直到当前节点无未被访问的邻接点,则退回到上一个节点,继续访问其未被访问的邻接点,直到所有点均已访问。如存储的示例图,访问顺序如下
深度优先搜索

图的连通性

  1. 无向图的连通分量
    在无向图中,如果从节点Vi到节点Vj有路径,则称节点Vi和节点Vj是连通的。如果途中任意两个节点都是连通的,则称图G为连通图。连通分量,即其子连通图。如下图,为连通图
    连通图
  2. 有向图的强连通分量
    在有向图中,如果图中的任意两个节点从Vi到Vj都有路径,且从Vj到Vi也有路径,则称图G为强连通图。强连通分量,即其子强连通图。如下图,为强连通图
    强连通图1 强连通图2
  3. 桥和割点
    如果去掉无向图G中的一条边Ei后,图G分裂为两个不相连的子图,那么Ei为图G的桥,或称割边;如果去掉无向图G中的一个节点Vi,及与Vi关联的所有边后,图G分裂为两个或两个以上不相连的子图,那么Vi称为图G的割点。
    存储的示例图,去掉d到e的边,则原图分裂为两个不连通的子图,因此,d到e的边,为图的
    桥
    存储的示例图,去掉节点d,及与d相连的边,则原图分裂为两个不连通的子图,因此,节点d为图的割点
    割点
    桥与割点的关系:有割点不一定有桥,有乔一定有割点;桥一定是割点依附的边
    桥与割点的算法:Tarjan算法
  4. 无向图的双连通分量(DCC)
    如果无向图中不存在桥,则称为边双连通图。图中任意两点之间都存在两条或两条以上的路径,且路径上的边互不重复。极大边双连通图,称为边双连通分量(e-DCC)。
    如果无向图中不存在割点,则称为点双连通图。图中,如果节点数大于2,则在任意两点间都存在两条或两条以上路径,且路径上的点互不重复。极大点双连通子图称为点双连通分量(v-DCC)。
  5. 双连通分量的缩点
    把每一个边双连通分量都看作一个点,把桥看作连接连个缩点的无向边,可得到一棵树,这种方法被称为边连通分量缩点。如图,虚线内看作一个节点
    边连通分量缩点
    把每一个点双连通分量都看作一个点,把割点看作一个点,每个割点都向包含它的点双连通分量连接一条边,得到一棵树,这种方法称为点双连通分量缩点。如图,虚线内看作一个节点
    点双连通分量缩点

参考《算法训练营》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读:矩阵乘法GEMM的cache优化,子矩阵的切分方法Anatomy of High-Performance MatrixMultiplication

矩阵乘法优化的知名论文goto paper&#xff1a; 矩阵乘法的优化需要将矩阵切分成子矩阵&#xff0c;用子矩阵相乘的结果组合为原矩阵相乘的结果&#xff1a; 上图是拆分矩阵的方法&#xff0c;M表示矩阵&#xff0c;X方向和Y方向的两个维度都是未知的。P表示横条或竖条&#x…

前端监控一vue指令实现埋点

前端监控一vue指令实现埋点 https://v2.vuejs.org/v2/guide/custom-directive.html 自定义指令 需要在main.js中执行 import Vue from vue // 自定义埋点指令 Vue.directive(track, {//钩子函数&#xff0c;只调用一次&#xff0c;指令第一次绑定到元素时调用。在这里可以…

Linux 下 nc 发送接收 udp、tcp数据

nc&#xff0c;全名叫 netcat&#xff0c;它可以用来完成很多的网络功能&#xff0c;譬如端口扫描、建立TCP/UDP连接&#xff0c;数据传输、网络调试等等&#xff0c;因此&#xff0c;它也常被称为网络工具的 瑞士军刀 。 一、只服务端使用nc 备注&#xff1a;这种方式只能发…

新能源汽车交流充电桩CP信号详解

随着新能源汽车的推广&#xff0c;交流充电桩迎来了巨大的市场需求&#xff0c;人们对车辆充电的便利性、安全性有着越来越高的要求。CP信号主要用于交流充电桩&#xff0c;充电桩和汽车之间只能通过CP信号进行通讯&#xff0c;判断、控制充电电流和状态。 汽车充电桩CP信号…

124.【SpringBoot 源码刨析C】

SpringBoot源码刨析C (三)、SpringBoot核心功能2.Web4.数据响应与内容协商(1).响应JSON&#xff08;1.1&#xff09;jackson.jarResponseBody&#xff08;1.1.1&#xff09;、返回值解析器&#xff08;1.1.2&#xff09;、返回值解析器原理 (1.2).SpringMVC到底支持哪些返回值(…

【STL】模拟实现简易 list

目录 1. 读源码 2. 框架搭建 3. list 的迭代器 4. list 的拷贝构造与赋值重载 拷贝构造 赋值重载 5. list 的常见重要接口实现 operator--() insert 接口 erase 接口 push_back 接口 push_front 接口 pop_back 接口 pop_front 接口 size 接口 clear 接口 别…

Window环境RabbitMq搭建部署

Erlang下载安装及配置环境变量 下载erlang&#xff0c;原因在于RabbitMQ服务端代码是使用并发式语言Erlang编写的 Erlang下载 Erlang官网下载&#xff1a; http://www.erlang.org/downloads Erlang国内镜像下载&#xff08;推荐&#xff09;&#xff1a; http://erlang.org/d…

旧版Xcode文件较大导致下载总是失败但又不能断点续传重新开始的解决方法

问题&#xff1a; 旧版mac下载旧版Xcode时需要进入https://developer.apple.com/download/all/?qxcode下载&#xff0c;但是下载这些文件需要登录。登录后下载中途很容易失败&#xff0c;失败后又必须重新下载。 解决方案&#xff1a; 下载这里面的内容都需要登录&#xff0…

Appium+python自动化(十九)- Monkey(猴子)参数(超详解)

前边几篇介绍了Monkey以及Monkey的事件&#xff0c;今天就给小伙伴们介绍和分享一下Monkey的参数。 首先我们看一下这幅图来大致了解一下&#xff1a; 1、Monkey 命令 基本参数介绍 -p <允许的包名列表> 用此参数指定一个或多个包。指定包之后&#xff0c;mon…

用html+javascript打造公文一键排版系统7:落款排版

一、公文落款的格式 公文落款包括单位署名和成文日期两个部分&#xff0c;其中成文日期中的数字 用阿拉伯数字将年、月、日标全&#xff0c;年份应标全称&#xff0c;月、日不编虚位&#xff08;即 1 不编为 01&#xff09;。 在实际应用工作中分为三种情况&#xff1a; &am…

【Selenium+Pytest+allure报告生成自动化测试框架】附带项目源码和项目部署文档

目录 前言 【文章末尾给大家留下了大量的福利】 测试框架简介 首先管理时间 添加配置文件 conf.py config.ini 读取配置文件 记录操作日志 简单理解POM模型 简单学习元素定位 管理页面元素 封装Selenium基类 创建页面对象 简单了解Pytest pytest.ini 编写测试…

保护数字世界的壁垒

随着科技的不断发展和互联网的普及&#xff0c;我们的生活日益依赖于数字化的世界。然而&#xff0c;随之而来的是网络安全威胁的不断增加。网络攻击、数据泄露和身份盗窃等问题已经成为我们所面临的现实。因此&#xff0c;网络安全变得尤为重要&#xff0c;我们需要采取措施来…

什么是分布式操作系统?我们为什么需要分布式操作系统?

分布式操作系统是一种特殊的操作系统&#xff0c;本质上属于多机操作系统&#xff0c;是传统单机操作系统的发展和延伸。它是将一个计算机系统划分为多个独立的计算单元(或者也可称为节点)&#xff0c;这些节点被部署到每台计算机上&#xff0c;然后被网络连接起来&#xff0c;…

Win10环境下Android Studio中运行Flutter HelloWorld项目

一、引言 Android Studio是Android的官方IDE(Integrated Development Environment)。它专为Android而打造&#xff0c;可以加快开发速度&#xff0c;为Android设备构建最高品质的应用。 Flutter是Google推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开…

【STL】list用法试做_底层实现

目录 一&#xff0c;list 使用 1. list 文档介绍 2. 常见接口 1. list中的sort 2. list sort 与 vector sort效率对比 3. 关于迭代器失效 4. clear 二&#xff0c;list 实现 1.框架搭建 2. 迭代器类——核心框架 3. operator-> 实现 4. const——迭代…

【计算机网络 01】说在前面 信息服务 因特网 ISP RFC技术文档 边缘与核心 交换方式 定义与分类 网络性能指标 计算机网络体系结构 章节小结

第一章--概述 说在前面1.1 计算机网络 信息时代作用1.2 因特网概述1.3 三种交换方式1.4 计算机网络 定义与分类1.5 计算机网络的性能指标1.6 计算机网络体系结构1 常见的计算机网络体系结构2 计算机网络体系结构分层的必要性3 计算机网络体系结构分层思想举例4 计算机网络体系结…

RuntimeError: DataLoader worker (pid 2105929) is killed by signal: Killed.

PyTorch DataLoader num_workers Test - 加快速度 可以利用PyTorch DataLoader类的多进程功能来加快神经网络训练过程。 加快训练进程 为了加快训练过程&#xff0c;我们将利用DataLoader类的num_workers可选属性。 num_workers属性告诉DataLoader实例要使用多少个子进程进…

23.多项式与非多项式曲线拟合对比(matlab程序)

1.简述 拟合标准&#xff1a; (1)原始数据向量与拟合向量之间的距离最小&#xff0c;该距离的度量一般使用误差平方和表示&#xff0c;即均方误差&#xff1a;R||Q-Y||22 (2)当均方误差最小时&#xff0c;说明构造的拟合向量与原始向量最为接近&#xff0c;这种曲线拟合的方法…

git commit -m时候没有保存package.json等文件

项目场景&#xff1a; 提示&#xff1a;git add . 和 git commit -m "保存" 操作&#xff0c;没有保存package.json等文件。 解决方案&#xff1a; 1.确保 package.json 文件没有被列在 .gitignore 文件中。打开 .gitignore 文件&#xff0c;检查是否有类似于 packa…

论文工具——ChatGPT结合PlotNeuralNet快速出神经网络深度学习模型图

文章目录 引言正文PlotNeuralNet安装使用使用python进行编辑使用latex进行编辑 样例利用chatGPT使用chatGPT生成Latex代码利用chatGPT生成对应的python代码 总结引用 引言 介绍如何安装PlotNeuralNet工具&#xff0c;并结合chatGPT减少学习成本&#xff0c;快速出图。将按照软…