自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(17)
  • 收藏
  • 关注

原创 图论-最大、小高度树

图论-最大、小高度树问题Leetcode 310分析用树的直径证明BFS答案要么是一个节点,要么是两个节点首先我们证明一下答案要么是一个节点,要么是两个节点。我们先给出树的直径的定义:图中所有最短路径的最大值即为「直径」,可以用两次 DFS 或者树形 DP 的方法在 O(n) 时间求出树的直径。我们把一个树的直径拉成一条直线:图中橙色节点为树直径上的节点,蓝色节点代表其他与图连通的其他节点。我们给出以下断言:最小高度树的节点只能是树直径上的节点,而且必须是直径的中点。我们设树

2021-01-29 22:43:10 802 1

原创 图论-最小生成森林

图论-最小生成森林问题P1195分析通过连接一些边,将这些节点连成k个最小生成树,构成的最小生成森林。我们有一下推断:含有一颗最小生成树,需要连接n-1条边,含有两颗最小生成树,需要连接n-2条边,含有k颗最小生成树,需要连接n-k条边。因此,我们只需要连接n-k个边即可,使用Kruskal算法即可。如果没连到n-k条边优先队列就为空了,那么就是无解。代码#include <bits/stdc++.h>using namespace std;int pre[1005];

2021-01-28 22:35:44 1734

原创 图论-欧拉图

图论-n笔画和欧拉图问题P1636分析对于一个无向连通图,求用几笔能画完?每一次起笔都从度为奇数的节点开始画起,画到任意另一个度为奇数的点结束,去掉已经画完的边,这个图将可能被分成几个连通分量,但是奇数度的点的个数不会变,每画一次就会消掉一对奇数点,因此答案为奇数度点的个数除以2。对于欧拉图我们要特判一下,如果是欧拉图答案应该是1而不是0。对于非连通图,我们应该通过dfs或者bfs用这个方法求每一个连通分量的笔画数,之后相加即可。...

2021-01-28 19:13:07 1671

原创 图论-DAG图中的最短路问题

图论-DAG图中的最短路问题根据节点的拓扑排序的次序来对带权重的有向无环图进行边的松弛操作,我们便可以在Θ(V+E)\Theta(V+E)Θ(V+E)的时间内计算出从单个源节点到所有节点之间的最短路径。因为DAG无环,因此不存在负权环,因此源节点到任意的最短路都是存在的。我们只需要按照拓扑排序的次序,来依次松弛节点的邻接边,即可。证明对于任意s到v的最短路(v0,v1,…,vk)(v_{0},v_{1},\dots,v_{k})(v0​,v1​,…,vk​),v0=s,vk=vv_{0}=s,v_{

2021-01-28 14:10:34 451

原创 图论-SPFA

图论-SPFA就像在我上一篇文章中提到的那样,BellmanFord算法有很多不必要的松弛操作,对于某一个最短路来说(v0,v1,…,vk)(v_{0},v_{1},\dots,v_{k})(v0​,v1​,…,vk​),从v0v_{0}v0​所连的边开始松弛才是最高效的,因此我们有如下定理:只有那些刚被松弛的边所连接的节点,才会引起这个节点所连的边松弛。我们根据这一条定理,给出了BellmanFord算法的改进算法,即SPFA(Shortest Path Faster Algorithm)。voi

2021-01-28 11:47:38 82

原创 图论-BellmanFord算法

图论-BellmanFord算法BellmanFord算法用于计算单源多节点最短路问题,并且能够处理负权重的边和判断是否存在负环。松弛操作在计算每个节点v来说,我们维持一个属性v.d为源节点s到v节点最短距离的上限。称为s到v的最短路径估计,松弛操作就是减少每个节点的v.d值,也就是最短路径的上限。void relax(int u, int v, int w){ if (d[v] > d[u] + w) { d[v] = d[u] + w; }}

2021-01-28 11:11:11 181 1

原创 循环不变式

循环不变式何为循环不变式?类比于数学中的数学归纳法。循环不变式分为三个部分,分别是初始化、保持、终止。初始化:在没有进入循环之前,这个循环不变式依然满足不变的属性。保持:在每一次循环开始之前,这个循环不变式依然满足不变的属性。终止:循环可以被证明终止,终止时,这个循环不变式依然满足不变的属性,此时就是答案的解。因此,在三个部分重复的一句话就是,这个循环不变式依然满足不变的属性。循坏不变式在任何时候都保持不变的特征。循环不变式是证明算法正确性的一个重要的方法,也是设计迭代算法重要的一依据。

2021-01-27 23:36:27 772

原创 图论-强连通分量

图论-强连通分量Kosaraju 算法我们定义节点的f值,即v.f为在DFS中节点的完成时间。我们有这样的事实:如果在有向图中,如果存在u→vu \to vu→v,那么u.f>v.fu.f > v.fu.f>v.f一定成立;反过来,如果存在v→uv \to uv→u,那么u.f<v.fu.f < v.fu.f<v.f一定成立。之后,我们用一个强连通分量中节点最大的f值代表这个强连通分量的f值。那么有如下的事实成立:如果在分量图GSCC=(VSCC,ESCC)G

2021-01-26 20:34:31 186

原创 图论-树的直径

图论-树的直径问题我们将一颗树T=(V,E)T=(V,E)T=(V,E)的直径定义为max⁡u,v∈Vδ(u,v)\max_{u,v \in V}\delta(u,v)maxu,v∈V​δ(u,v),其中δ(u,v)\delta(u,v)δ(u,v)代表从u到v的最短路径。也就是树中所有最短路径的最大值。请设计一个算法,求这颗树的直径。分析我们使用两次BFS即可,第一次随机选取一个节点当做为源节点,之后找到里源节点最远的那个节点,就是直径的一个端点。直径要么经过源节点S,要么不经过,我们可以证明

2021-01-26 15:56:55 400

原创 图论-关联矩阵

图论-关联矩阵问题有向无环图G=(V,E)G=(V,E)G=(V,E)的关联矩阵是满足下述条件的∣V∣×∣E∣|V| \times |E|∣V∣×∣E∣矩阵B=(bij)B=(b_{ij})B=(bij​)。bij={−1如果边j从节点i出发1如果边j进入节点0其他b_{ij} = \left\{\begin{matrix} & -1 & 如果边j从节点i出发 \\ & 1 & 如果边j进入节点 \\ & 0 & 其他\end{matr

2021-01-26 15:05:31 2218

原创 图论-通用汇点

图论-通用汇点问题给定一个有向无环图G=(V,E)G=(V,E)G=(V,E)的邻接矩阵表示,给出一个时间复杂度为O(V)O(V)O(V)的算法,判断图是否存在一个通用汇点。通用汇点指的是入度为∣V∣−1|V|-1∣V∣−1但出度为0的点。分析在有向无环图G中,通用汇点如果存在,且只能存在一个。如果存在两个,那么任意一个的入度都不满足∣V∣−1|V|-1∣V∣−1。假设通用汇点为节点i,那么邻接矩阵的第i行全是0,满足出度为0。同理,第i列除矩阵主对角线以外的位置全为1,满足入度为∣V∣−1|V

2021-01-26 14:44:06 437

原创 图论-平方图

平方图此文我们讨论一下对一个邻接矩阵进行平方,三次方,n次方的意义和相应的邻接链表的算法。首先我们定义k×kk \times kk×k邻接矩阵GGG,则元素Gxy2=∑i=1kGxk⋅GkyG^{2}_{xy}= \sum_{i=1}^{k}G_{xk} \cdot G_{ky}Gxy2​=i=1∑k​Gxk​⋅Gky​因此邻接矩阵平方相乘的意义是得到平方图,即有向图G=(V,E)G=(V,E)G=(V,E)的平方图是图G2=(V,E2)G^{2}=(V,E^{2})G2=(V,E2),边(u,

2021-01-24 23:24:45 2830

原创 数论算法导论

文章目录前言一、数论基本概念1.1 整除性与约数1.1 素数和合数1.2 除法定理、余数和等模1.3 公约数与最大公约数二、使用步骤1.引入库2.读入数据总结前言数论是算法里面及其重要的组成部分,在竞赛中使用数论,通常能写出O(1)高效率级别的算法。数论包括基本概念、欧几里得算法、模运算、倍数与模、中国余数定理、幂与模、RSA算法、素数与素数测试、因数分解等核心内容。一、数论基本概念1.1 整除性与约数定义:符号“d | a”(读作d整除a)的含义是,存在某个整数k,有a=kd存在。特别的任何

2021-01-19 15:59:03 1146

原创 数据结构、算法与应用读书笔记系列 - 树

文章目录前言一、树的相关概念二、并查集1.路径压缩2.启发式合并二、优先队列2.1左高树三、竞赛树四、搜索树总结前言此文重点总结一下树的相关概念和优先队列(堆和左高树)、AVL平衡搜索树、竞赛树、红黑树、B树。一、树的相关概念树:一颗树是一个非空有限元素的集合,其中一个元素为根,其余元素组成子树。孩子节点:一个节点下面的最近子节点。父母节点:一个节点的上级节点,只能有一个。兄弟节点:同属于一个父母节点的节点。祖父节点:父母节点的父母节点。后代节点:孩子节点和孩子节点的孩子节点等。祖先

2021-01-18 15:10:01 103

原创 数据结构、算法与应用读书笔记系列 - 跳表和散列表

文章目录前言前言此文总结一下跳表和散列表,增加了额外向前的指针的链表叫做跳表,散列表使用散列函数。本书我觉得描述的不太好,故不在此处赘述,今后可能重新写一文章总结。

2021-01-18 13:48:26 124

原创 数据结构、算法与应用读书笔记系列 - 线性表

文章目录前言一、循环链表和哨兵结点的妙用二、多维数组遍历性能问题总结前言此文总结一下本书的线性表知识,基础内容不再赘述,只记录一些有用的知识。一、循环链表和哨兵结点的妙用哨兵节点可以避免一些NULL值的判断很方便。循环链表在查询的时候处理查询失败的情况很方便。struct ListNode{ int val; ListNode *next;};int search(ListNode *head, int target){ // head是一个循环链表的哨兵节点

2021-01-18 11:48:48 82

原创 数据结构、算法与应用读书笔记系列 - 程序性能分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、测试与调试1.什么是测试2.测试数据设计2.1 黑盒法2.2 白盒法二、程序性能分析1.空间复杂度2.时间复杂度2.1大O记法2.1Ω\OmegaΩ记法和Θ\ThetaΘ记法2.3多元函数分析2.1小o记法三、性能测试总结前言数据结构、算法与应用一书中,描述了测试方法,复杂度分析,性能测量等对于算法性能的分析方式,此文对以问题进行总结。一、测试与调试1.什么是测试有时候,通过数学方法严格的证明程序的正确性是很难的

2021-01-18 10:53:30 143

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除