自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网络最大流(EK算法)

.这些算法的都基于一个FF(Ford-Fulkerson)的思想,也不是都要求掌握,一般只要会EK,和Dinic,Dinic是EK,的优化,ISPA的效率又比Dinic的稍快,但是j基本上Diniic都能解决,一般不会卡。这俩个概念自己去了解,因为文字叙述感觉讲不清楚,但是搞图太麻烦,所以自己去了解一下这俩个概念。在一个网络E中每条边都有一个被称为容量的权值,有俩个特殊的点叫做源点和汇点。,其与一般有向图的不同之处在于有容量和源汇点。:网络(network)是指一个特殊的有向图。

2024-04-19 16:38:57 253

原创 网络最大流(Dinic)

然而这样的效率是极低的,因为ek算法每次只会找一条增广路,并且每次只会更新一条残留网络.为了提高效率,就有了我们的Dinic算法。总的来说也就俩步:1 查找是否存在增广路 2把所有能找到的增广路都搜掉,这样的话就最大化了每次bfs找增广路的效果。限制dfs的搜索范围,在分层图中任意路劲都是边数最少的最短路径,当把v共某节点上的容量用完之后,进行剪枝。当用完了一条边之后就不可能再次搜索这条边,于是通过当前弧优化,减少多余的dfs。一下就是俩步骤:1,找增广路 2,更新残留网络。

2024-04-19 16:38:54 118

原创 二分(板子)

二分这个东东看似简单,一学就会,但是一写就废,因为二分里面存在这很多的细节,然后往往回让人写错,这里写俩个板子。第一个4出现的下标为5,最后一个4出现的下标为10,这里分别给俩个板子,求出最后一个和第一个出现的4的下标。这里先个一个数列 1 2 3 3 4 4 4 4 4 4。

2024-04-15 22:25:09 137

原创 缩点(点的双连通分量)

这里分为俩种情况:对于一个点u如果他是开始搜索的,也就是根节点,如果他的子节点存在俩个及以上的在不同连通分量里面的,并且low[v]>=dfn[u]那么这个u点就是割点,如果u不是根节点,如果存在一个点v,low[v]>=dfn[u],那么这个点就是割点。对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点(又称割顶)。那么如何寻找各个点:同样是使用我们的tarja算法,进行;

2024-04-15 22:24:55 320

原创 边双连通分量

前面我们已经知道, 对与一个有向图,他有强联通分量,通过强连通分量的缩点,我们可以优化很多问题,那么对于一个无向图,他也有类似于强联通分量的东西,边双连通分量,点双连通分量,这里我来介绍一下边双连通分量。以上的做法是用链式前向星写的,个人感觉比较古老,而且感觉tj里面传入的是idx十分不舒服,在网上好像也很难找到不同的,于是就自己写个比较好理解的。这里引入一个桥的概念,就是对于一个边如果去掉了这条边,这个图就不能完全连通,那么这条边就称之为桥;边双连通分量:在一张连通的无向图中,对于两个点。

2024-04-11 18:34:00 137

原创 tarjan求强连通分量

所以对于一个有向有环的图中,环中的点可以相互到达,那么这个环就是就是一个强连通分量,那么我们就可以将其优化为DAG,求解问题的时候就会很方便,那么如何求解强连通分量:运用tarjan算法,时间复杂度为o(n+m)2,强连通分量(strongly conected components)SCC:极大的强连通子图。1,强连通:有向图强连通指的是有向图内任意俩个点都可以相互联通。这里我们先了解几个概念。

2024-03-24 12:10:24 255 1

原创 树形dp(……)

一个学生要从这些课程里选择 $M$ 门课程学习,问他能获得的最大学分是多少?一道非常简单的树形dp,此题一看就会让人联想到树形dp,但是唯一麻烦的就是没有直接选修课的数量有点多怎么半,那就有好多颗树了,这里其实我们可以将他们合并起来,全部都变成一棵树上的东西,选取的课的数目加1,然后这题就要多简单就有多简单了,简直不要太板子题。接下来的 N$行,第 I+1 行包含两个整数 k_i 和 s_i, k_i 表示第I门课的直接先修课,s_i表示第I门课的学分。### 样例输入 #1。### 样例输出 #1。

2024-03-18 21:21:05 188

原创 树形dp(树的直径)

对于求树的直径的问题,一般来说有俩种方法,第一种直接dfs搜索查找,第一次随意选择一点查找找到距离这个点最远的距离,因为树是一个联通图,所以我们容易就能判断出这个点是直径的一个端点,然后继续从这个点开始dfs,就能查找到另外一个端点和距离。以某一个节点u为根,定义f[u],g[u]为从u出发所能到达的最大长度和次大长度,那么这个以u为根的直径最长f[u]+g[u]直径的长度就为max(f[i]+g[i]);这里说个需要注意的东西,树可以以任意节点为根,都可已形成一棵树,可以自己手动试试。

2024-03-14 17:20:39 159 1

原创 dp背包问题(四)

所以这种背包问题又不可避免地和树形dp有所联系,同样地用dp[u][j]来表示以u为根节点,体积为j的背包所能得到的最大体积,我们再不断地递归搜索,以u为根节点,在每一个子遍历出最大地dp[u][j],最终就可以得到我们想要地值。这里在提一个注意的点,就是在dfs(son)下面的j是从大往小地推的,这里的细节和01背包的一维滚动数组优化是同一个道理,因为后面更新的dp[i][j]的值会用到前面·的如果从大往小就会出现问题,如果选择一个物品,则必须选择它的父节点。有 N个物品和一个容量是 V 的背包。

2024-03-14 17:19:22 639 1

原创 背包问题(三)

有依赖的背包问题也是一种背包问题,但是这种题往往会和树形dp相结合这里先给一道非常有名的例题:金明的预算方案金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 n 元钱就行”。如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、1 个或 2 个附件。每个附件对应一个主件,附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的 n 元。

2024-03-10 23:53:38 296 1

原创 dp背包问题(二)

但是如果我将数据范围改一改,n,v,w,s<2000,那么n^3次方的时间复杂度就不行,这是一定会T的,所以这里就介绍一种二进制优化的方法,将数量为s的某物品拆分为二进制数据,将其打包成一个种类的物品,然后对于这种物品下选择任意数量我们都可以通过二进制数的组合来实现,这样问题就变成了一个简单的01背包问题,时间复杂度就变成了v*n*logs,大概是4e7,在1e8之内。,同样的前i种物品中,背包体积为j的情况下所能拿到物品价值的最大值,因为每种物品的数量都不同,所以我们需要枚举每种物品的不同数量是否选择。

2024-03-03 15:03:51 227 1

原创 dp背包问题(一)

这里我们就不难得出状态转移方程,如果这件第i个物品不拿,dp[i][j]=dp[i-1][j],如果第i件物品要拿,dp[i][j]=dp[i-1][j-v[i]]+w[i];完全背包问题就有了不同,完全背包是给你一个体积为v的背包,n种物品,但是每种物品都有无限个可以无限拿,每种物品的价值又有所不同,求出你所能拿到的最大价值。同样的状态表示:dp[i][j];通过上面的推导,我们不难发现dp[i][j]=max(dp[i-1][j],dp[i-1][j-v]+w),由此得出状太转移的方程。

2024-03-02 20:11:42 253

原创 RMQ(倍增)

st表是用来预处理一个数组,然后在O(1),的时间之内查出区间的最值。这里主要运用了倍增和地推的思想,和lca求公共祖先的方法类似;上次写了一道题,发现尽然要用st表,但是想的时候发现还是需要一点点时间,这里写个板子,顺便复习一手。

2024-02-29 15:34:44 146

原创 二分图·(染色法+匈牙利)

就比如有俩个集合,一边是男的一边是女的,男的有n1个,女的有n2个,如果双发之间有好感度就有可能在一起,当然假设男女的性取向都很正确,所以不存在男男,女女的情况,而我们要求的就是男女能匹配到一起的最大匹配数量。这里的话假设我们从男方角度出发,如果男有与女生有好感度,那么我们就可以记录女生所匹配的,如果这个女生已经有匹配的了,那么我们试试嫩否让这个女生匹配的男的换一个女朋友然后再占为己有。染色法即通过dfs的方式,将一个点染色为1或则2,然而1所连接的边必须式2,不能是1,同理,2能连接的边也必须是1。

2024-02-27 19:25:22 111

原创 LCA最近公共祖先(倍增法)

每一次我们向上跳都跳2的x次方,可以更加快速的达到,这里我们要维护俩个数组,fa[i][j],指的是从i点往上跳2^j次方所能达到的点,根据地推可以得到,fa[i][j]=fa[fa[i][j-1]][j-1];首先,介绍一下朴素的算法,如果要找到a和b的最近公共祖先,我们令a的深度大于b的深度,然后从a开始一部一部往上走,知道a和b在同一高度,然后我们再继续让a和b同时往上走,直到俩个点为同一点。使时间复杂度为nlogn;:在一颗树上,若节点是c是a的祖先也是b的祖先就为a和b的公共祖先。

2024-02-17 13:51:23 188 2

原创 树状数组(例洛谷p1673)

应为我们要找一个三个数,而且得是连续徐上升的三个子序列,所以我们只需要记录比第i个数小的但是出现在i左边,和比第i个数大,但是出现在第i个数右边,然后ans+=(le[i]*ri[i]),就是最终的答案。树状数组算是一个非常奇葩的高级数据结构,(ge人理解),相对于线段树理解起来更加麻烦,但是代码实现却是比较简单。这题还有一个线段树的做法,如果有需求·评论区·留言。这里以洛谷p1637作为例题。

2024-02-13 21:37:54 125 2

原创 dijkstra+spfa

然而dj算法的效率虽然高但是dj的方法只适合所有没有负边的,如果出现了负边就不行了,这里就有了spfa。在dj里面st是一个判断是否已经找到最短路的集合,而spfa里面则是判断这个点是否在队列中。虽然总体上看spfa的时间复杂度也是nlogn,但是其效率会比dj低好多。一个是dj,dj主要是运用了贪心的思想,不断的找到最短路径并且记录他们。求最短路的问题有有俩种最常见的算法。这里要注意的是俩个st[N],数组。

2024-01-13 20:49:26 493 2

原创 最小生成树

最小生成树主要有俩种算法,一种prim时间复杂度n*n,这种方法和朴树版大的dj算法很相似,用了贪心的思想。首先将所有边按权重排序,然后从小到达枚举每条边,如果a,b俩点不在一个连通块,就合并他们;再来讲一讲kruskal算法,其算法是nlogn,这里就涉及了一些并查集的知识。代码上已经添加了详细解释。

2024-01-12 18:37:25 450 1

原创 trie树,字典树

trie树:用来高效存储和查找字符串的集合的数据结构。字典树很简单,也很容易理解这是一道基础的例题:p2580。

2023-12-01 15:08:38 24 1

原创 KMP算法匹配模式

这里再提一下,前缀和后缀,next数组求得其实就是最长前缀和后缀相等的一个关系,看一个例子。abaabac,这个的next数组为0,0,1,1,0,0,3,我们看第六个a,如果匹配到第七个字符c时不相等,及a[j+1]!在一个模板串中寻找一个字串的位置,这个看起来非常容易,直接暴力算法,但是时间复杂度为O(mn),主要思路就是俩个for循环,对于母串中的每一个进行判断,但这其中确有好多的重复步骤,因为一旦匹配到不同的就得重新从头匹配,而这三位科学家就给出了优化算法:KMP。

2023-11-30 15:56:36 26

原创 分治-->快排+归并

然后对分好的区间进行递归同上处理,将长度为n的区间,不断进行分化,知道最后俩个数一个数,这样就会将所有的数拍好,下面给出代码。不难看出这俩中排序都有很多的细节问题,也许有现成的sort可以用,但是可以学习其中的思想,比如说递归的使用,分治的思想,双指针等等都有涉及。归并排序就是有俩个步骤,分组,和并,注意是先分组,再合并,,和快排有所不同,分组使用递归来实现,合并的时候得进行排序。怎么说呢,就是先将最小的子区间拍好序合并,再将拍好序的子区间不断合并,雪球越滚越大,最后合并完成。

2023-11-24 22:30:10 17 1

原创 手写队列和二叉堆

用A[i]村村二叉树,节点数为n,1为根节点,如果i大于1,其父节点为i/2,如果i有儿子,那么左儿子为2*1,由儿子为2*i-1;堆的实现主要通过俩个操作,上浮(就是插入push),下沉(就是pop)队列是线性基础的数据结构之一,平常的使用也非常多,这里给大家写了一个手写队列,(简化版,静态数组:主要是为初学加强理解)这里重点讲的就是堆,他其实是一个二叉树的结构,我们首先需要一点点的基本知识。掌握了队列的使用,双端队列就是加了一头一尾,栈就是少了尾。

2023-11-20 17:54:16 24 1

原创 前缀和与差分

前缀和的思想很常用,当我们需要对一段数列多次求其和的时候,就可以简少运算次数,使得O(n*n)的时间复杂度转化为O(n),前缀和有一个常用递归代码。差分被称为是前缀和的逆运算,因为差分求的是前一个数与后一个数的差,常用于要对一段序列进行增减的运算可以大大减少时间复杂度。如二维前缀和s[i][j]指的是从(1,1)到(i,j)的和;而对俩坐标内的数据进行改变,则如图所示,左上角++,右下角++,左下边--,右上边--同样的,是二维前缀和的反例,也同样给一道例题。而要求二维前缀和的差距,则和。

2023-10-31 19:42:35 39 2

原创 c++string 常用函数

在刷题的时候我总是会遇到许多关于字符串操作的题目,然而每次使用字符串相关的函数时总是会忘,这里给各位做一个小总结。字符串的提出都可以通过切片索引来得到,再就是添加,添加一般俩字符串直接相加+,一个加号就可以解决。该函数会返回找到的字符串的位置的第一个索引,如果没找到就会返回string::npos,比较容易记。还有就是在头文件<sstream>字符串流的使用了,相当于重新进了一个缓存区,输出结果是hello world(中间换行)首先是基础的,不太需要记的。哦,对了,还有一个在算法题里容易用到的函数。

2023-10-28 18:58:19 37 1

原创 高精度模拟

又是不知道多少天地学习,真是忙忙碌碌,忙忙碌碌!最近很多人问到我一个求阶乘之和的题,本来俩个for循环搞定的事,确实不难,然而阶乘的范围有点大,大到什么程度呢?大到了一个long long 都装不下!这里就要引入我们的算法高精度了。要解决这道题我们首先需要学会高精乘法,和高精加法。

2023-10-21 23:05:12 31 2

原创 朴素筛法+埃氏筛法+欧拉(线性)筛

我们知道如果一个数是素数,那么它的倍数一定是合数,于是我们将素数的倍数全部筛掉,那么剩下的就都是素数了,然而这还是存在重复,因为同一个数例如120,就被好几个素数筛过,如2,3,5....于是就有了欧拉筛(也叫做线性筛)然而这样的算法很简单,但是如果我们需要在1--10000中判断是否是素数,就会发生很多重复,不仅耗时长,而且效率级低,于是就有了我们的埃氏筛法!欧拉筛和埃氏筛很像,正如你所见,其实最关键的一步就是我上面所注释的,有了这个判断,我们就可以避免很多重复,使效率达到最高!

2023-09-23 21:26:57 91 6

原创 初识C语言

在军训进行时我也在开始了C语言的学习,伴随这军训的开始,我也从hello world!开始到基础的if和while语句,接着数组和字符串,到结构体和共用体,到指针的练习和应用,尾随着军训结束,也走到了文件的读写;15天左右,沉醉在编程的世界里收获颇丰。

2023-09-23 16:59:41 113 2

空空如也

空空如也

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

TA关注的人

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