福州培训之图论(2月12日)

本文介绍了图论的基本概念,包括图的定义、有向图与无向图的区别,以及图的储存方式如邻接矩阵与邻接表。此外,还深入探讨了图的遍历算法,如深度优先搜索(DFS)和广度优先搜索(BFS),并讲解了生成树、最小生成树的构建算法,以及最短路径算法如Dijkstra算法、SPFA算法和Floyd算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                          福州培训最后一天

Emmmm

最后一天了

不知该怎么说

我能写一篇培训感受吗,算了,还是写上课笔记吧,其实也没啥笔记,根本没听懂

图论:

图是由一个顶点的集合V和一个顶点间关系的集合E组成,记为G=(V,E)

V:顶点的有限非空集合

E:顶点间关系的优先集合(边集)

存在一个结点V,可能含多个前驱结点和后继结点,用不带箭头的边表示结点关系

有向图:按照固定方向走,通常用带箭头的边连接两个有关联的结点

无向图:可往反方向走

路径、简单路径、回路:

1.    如果一条路径上的结点除起点x1和终点xk可以相同外,其他结点均不同,则称此为一条简单路径。

2.    X1=xk的简单路径成为回路(也称为环)

储存方式:

邻接矩阵:

空间复杂度为O(n2),表示结点间相邻关系的矩阵。

          格式:

          a[i][j]={1(或权值):无向图:有边(i,j)和边(j,i);有向图:有边<i,j> / 0:i到j无边}

          输入:

           对角线为0:结点自身不相连

           无向图:是对称矩阵。有向图一般不是

           第i行非0的个数是结点i的度

          输入情况:

1.    直接给出邻接矩阵,直接读入即可

2.    给出边的顶点

3.    给出每个结点的邻接点

(详细代码见黑皮书)

 

邻接表:

     空间复杂度为O(|E|),

1.    无权图:设置结点指针

结点——>邻接点指针

2.    有权图:*结点——>邻接点指针;邻接点——>边权值——>下一个邻接点指针

3.    用数组模拟有权图:对于从x为起始点的边,在邻接表里装入所对应的y值,以及权值v,以及以x为起点的前一个所对应的y值的编号,link数组里装入以i好点为起点的边中所对应的最后一个y值。我们可以这样理解e数组,e数组里包含了n个链表,每个表都是以某个端点为起点的边的集合。这要好好理解一下。

*结点相邻边的总数s——>第一条邻接边next ;邻接点——>边权值——>下一个邻接边

    储存邻接表:(详情见黑皮书)

有向无环图:这是什么鬼

 

邻接矩阵和邻接表的优点:

 邻接矩阵:代码书写简单,找邻接点慢

           采用二维数组的静态存储结构

           一般点数|v|小于等于5000的时候,用邻接矩阵。

邻接表:代码书写较复杂,找邻接点快,适用于稀疏图

       采用动态存储结构(指针或用数组模拟)

        一般点数|v|大于等于5000,并且边得个数不是很多的时候,用邻接表,

        并且现在一般都用数组来模拟。

     数组模拟链表的速度会快一点,并且能避免一些错误。

对于在图论里数据出现的重边问题,邻接矩阵必须判断,邻接表则可以直接处理

/*边集数组:*/

前向星(可背邻接表代替)

图的遍历:

1. 深度优先搜索DFS:

遍历算法(递归过程)

(1).从某一初始点出发点i开始访问,输出该点编号,并对改点做被访问标志(以免被重复访问)

(2).再从i的其中一个未被访问的邻接点j作为初始点出发继续深搜。

  当i的所有邻接点都被访问完,则退回到i的父结点,当另一个邻接点k再继续深搜直到全部结点访问完毕

2. 广度优先搜索(宽度优先搜索)BFS

按层次遍历:

 从图中某结点i出发,在访问i之后,再一次访问i的各个未曾访问的邻接点,然后分别从这些邻接点出发按广度优先搜索的顺序遍历图,直至图中所有可被访问的结点都被访问到。

图的传递闭包:

   判断无向图的连通性

G的传递闭包:G*=(V,E*)

              E*={(i,j):图G中存在一条i到j的路径}表示(见黑皮书)

  入度:

以该顶点为终点的边的数目和

  出度:

    以该顶点为起始点的边的数目和

入度为0的点即可做开头

度数为奇数的顶点叫做奇点,度数为偶数的顶点叫做偶点

度:等于该顶点的入度和出度之和

结论:图中所有顶点的度=边数的两倍

最早能做开头的点到最后能做开头的点依次排序

生成树:

无向图,取其中|v|-1条边,并连接所有顶点,则组成原图的一个生成树

 |属性|:|v|-1条边、连通、无环

最小生成树: 加权图的最小生成树是一棵生成树

Prim普通算法 O(|v|2)

Prim算法中用“堆“方法   O((|E|+|V|)*log|V|)-----对稀疏图较好

Kruskal算法  O(|E|*log|E|+|N|*A|V|)-----对稀疏图较好

最短路:从某一个点到另一个点的最短路径

  Dijkstra算法:

      定义:单源点最短路径

      迪杰斯特拉算法应用的是贪心的思想,这个算法的思路的出发点是,如果源点到某个点x的距离是到其他点的距离的最小值,那么到第点x的最短距离

       目标:图中下一个顶点到其他顶点的最短路径,不能有负权。----单源,非负

       原理:经严格证明的贪心

       时间复杂度:O(n2)

  SPFA算法:

      每次都要检查所有边,这看起来比较浪费,对于(x,y),如果上一次dis[x]没有改变,则本次的检查显然多余

      我们每次只要从上次刚被“松弛“过的点x,来看看x能不能松弛其他点即可

      SPFA算法中用BFS中的队列来存放刚被“松弛“过的点,由于顶点个数未|V|,队列如果用数组的话显然要用”循环队列“使用空间

      时间复杂度:O(K*E)

  Floyed算法:

      目标:把图中任意点i与j之间的最短距离都求出来

      原理:根据图的传递闭包思想:

             If(d[i][k]+d[k][j]<d[i][j])

                d[i][j]=d[i][k]+d[k][j];

      时间复杂度:O(n3)

  博客到此为止,拓补可能有些问题,需自行参考,that’s all

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值