
算法与数据结构
文章平均质量分 65
分享算法和数据结构知识
Peterliang233
南昌大学本科在读,计算机专业,ACM退役选手,主用Golang和C++,现某互联网大厂实习。分享所学,共促成长。
展开
-
图论学习之Dijkstra算法的总结
图算法——最短路径——Dijkstra(迪杰斯特拉)算法思路整理及基本模板这种算法是为了解决最短路径中的一种问题——在一个有向图中,从某一个固定的点出发,然后求到达每个结点的最短的路径的距离。一开始对于这类问题的思路是可不可以用一个记忆化的搜索进行暴力搜索,然后遍历到当前结点的时候进行更新为最小值。但是似乎如果数据量比较大的时候复杂度有点大。下面就来介绍一下Dijkstra算法基本思想,就是从最初规定的出发的那个点开始进行传递,然后先假设最初点s到其余所有的点距离为无穷大,然后逐层更新每个点的最短路径原创 2020-07-23 11:57:01 · 4222 阅读 · 0 评论 -
数论学习之约数
最近学数论真的感觉自己脑子很不好用啊,一个证明题想半天。感觉一些基础的知识还是比较重要的,所以就记录下来吧,加深一下印象。对于一个整数n,假如我们想求到这个整数的所有的约数的话,我们只要对其1−n1-\sqrt{n}1−n之间找可以被n整除的那些数,然后就可以找到它们的约数了。时间复杂度O(n)O(\sqrt{n})O(n).代码://试除法int factor[1600],m=0;for(int i=1;i*i<=n;i++){ if(n%i==0){ factor[++m]=原创 2020-08-27 20:18:48 · 226 阅读 · 0 评论 -
最小生成树之prim算法&&kurskal算法
首先,我们来说一下图当中的最小生成树,对于一个无向图来说,它的最小生成树的定义如下:1,该数经过所有的结点2,经过的所有的结点的边权之和最小3,这棵树的起点可以是任意的点,不过一般都是题目中指定的prim算法:适用范围:边多点少的稠密图。复杂度:O(v^2)与Dijkstra算法相比,该算法的区别是里面的d数组,Dijkstra算法的d表示的是当前的结点v距离起始节点s的最短距离,而该算法的d表示的是当前结点和它的上一个结点之间的最短距离。我们的Dijkstra算法里面的起点在我们的prim算原创 2020-07-26 00:06:12 · 221 阅读 · 0 评论 -
Bellman-Ford算法和SPFA算法以及Floyd算法学习心得
对于BF算法,我们主要是用于解决Dijkstra算法不能解决的问题,我们之前说到,Dijkstra算法的使用范围是结点之间的边权为正数的情况。所以BF算法可以解决边权为负的情况。我们考虑环的问题,我们可以知道,如果某个点经过一系列的点后回到自身后,如果边权之和为正的话,则称为正环,为0则为零环,为负则为负环。对于正环和零环的情况,我们可以知道不会影响最短路径的取值,但是如果出现负环,我们的算法就很可能受到影响。但是,因为我们考虑的是有向图的情况,如果我们从源点出发不能通过该负环到达我们要源点自身,那么最短原创 2020-07-24 22:33:58 · 295 阅读 · 0 评论 -
拓扑排序
先来认识一下有向无环图:一个有向图的任意顶点都无法通过一些有向边回到该点自身,就称之为有向无环图。对于拓扑排序,是根据边的先后顺序来进行排列,比如:u->v,表示点可以由u到达v,那么u就要排在v的前面,如果两者之间的层数相同,那么就可以任意的排列,当然有的时候题目会限制,比如按照编号大小来进行排列。看这个图,我们已经标明了它们的边的指向,1,3都是可以当作起点,因为它们都是属于第一层的点,1->2,说明1排在2的前面,然后我们发现4可以由2,3都可以指向,则2,3一定要在4的前面,所以我们原创 2020-07-26 12:04:49 · 267 阅读 · 0 评论 -
关键路径学习心得
预备知识:AOV(Activity On Vertex)网,也叫做顶点活动网。指的是用顶点表示的是时间,用边集表示的是时间发生的先后顺序。AOE(Activity On Edge)网,也叫做边活动网。指的是用带权的边集表示活动,用顶点表示事件的有向图,也就是经过该活动之后就可以发生这个事件了。注意这两种是不同的模型,但是AOV网也可以在一定程度上转化为AOE网,就是把一个结点拆成两个点,然后从两个点之间添加一条边表示权,两个网都是有向无环图。最长路径:我们之前学过最短路径的求法,而最长路径顾名思义就原创 2020-07-26 14:57:06 · 929 阅读 · 0 评论 -
数论学习之质数
我们主要介绍两种高效的找质数的方法。1、埃式筛法对于一个质数x,我们知道x的倍数肯定不是质数了,如:2是质数,所有2x2,2x3,2x4这些都不是质数了。我们利用一个数组v来进行标记,没被标记的就是质数了。时间复杂度为O(NloglogN)O(NloglogN)O(NloglogN)代码://埃式筛void primer(int n){ memset(v,0,sizeof(v)); for(int i=2;i*i<=n;i++){ if(v[i]) continue; for(原创 2020-08-27 21:21:08 · 455 阅读 · 1 评论 -
非递归实现有序数组构建BST
前置知识BST,就是我们平时说的平衡二叉树。这种树的性质是对于节点root,root左边的所有的子节点的权值都小于这个root的权值,root右边所有子树的权值都大于root的权值。BST构建的两种方法递归实现这种实现方法一般比较方便,思维含量也相对较低。就是根据树的可递归的性质,我们对树进行递归构建,从根开始向叶子结点进行构建,我们利用二分的方法进行处理,当前边界二分之后的终点的权值就是我们当前这个结点的权值了。代码如下/** * struct TreeNode { * .原创 2022-05-15 23:11:42 · 246 阅读 · 0 评论 -
2020江西省大学生程序设计竞赛题解
A Simple Math Problem这个是一个数论题目,我们先将题目要求的式子进行转化∑i=1n∑j=1i[gcd(i,j)==1]f[j]=∑i=1n∑j=1nf[i][gcd(i,j)=1]−∑i=1n∑j=1if[i][gcd(i,j)=1]+f(1)\sum_{i=1}^n\sum_{j=1}^i[gcd(i,j)==1]f[j] \\=\sum_{i=1}^n\sum_{j=1}^nf[i][gcd(i,j)=1]-\sum_{i=1}^n\sum_{j=1}^if[i][gcd原创 2021-10-22 14:12:05 · 969 阅读 · 2 评论 -
2019CCPC哈尔滨站题解
J. Justifying the Conjecture题目意思我们需要将一个合数转化为一个素书和一个合数相加的结果。思路分析我们很容易判断如果这个数字x是奇数,那么我们可以和3和x-3组合在一起。因为x-3一定是一个偶数,但是这里要排除x-3=2的情况,所以我们先对0-5的情况进行特判就行了。然后如果x为偶数,那么拆分成2和x-2的形式,因为这里x-2一定是一个偶数,偶数除了2都是合数。代码如下#include<bits/stdc++.h> using name原创 2021-09-17 10:52:19 · 702 阅读 · 0 评论 -
Codeforces Global Round 16题解A-E
A. Median Maximization题意:给出一个数组的大小,和这个数组的和,我们需要构造一个数组,使得我们最后得到的数组排序之后的上中位数尽可能大,要求这个数组的数字都要大于等于0.贪心+构造。显然,由于我们数组的总值是固定的,所以为了使中位数尽可能大,我们需要想办法尽可能将有限的数字分的份数更少。怎么分呢?就是中位数的位置前的都分0,其他就平均分,中位数向下取整就行了。最后的答案就是⌊s/(n−⌈n2⌉+1)⌋\lfloor s/(n-\lceil \frac{n}{2} \rceil +原创 2021-09-13 18:03:21 · 325 阅读 · 0 评论 -
2019ICPC-银川站补题
下下周就要打icpc银川站了,今天和队友一起做了一套2019年的银川站的原题,感觉收获很多,也发现了很多问题。趁有时间补下题吧,也算是给自己积点幸运值。希望接下来的icpc银川站可以取得自己满意的成绩。菜鸡只希望拿个铜牌就行了。QAQ。N. Fibonacci Sequence签到题,直接输出非波纳西数列的前5项就行了,拼手速的话直接用python就行了。print('1 1 2 3 5')B. So Easy给一个n行n列的矩阵,初始时全部都是0,可以对某一行整行或者某一列的整列进行同时加上某原创 2021-05-01 22:48:03 · 957 阅读 · 1 评论 -
埃氏筛和线性筛的比较
这段时间在洛谷上面写题目的时候,发现对于莫比乌斯反演这种题目,以及一些其他的求素数的题目,假如要进行筛素数的时候,用埃氏筛一般都会被T,所以我想对这两种算法进行一个性能的对比。首先,我们来看到埃氏筛,先给出代码://筛出1-n之间的素数bool vis[1e7]={false}; //初始化全为falsevoid Eratosthenes(int n){ for(int i=2;i<=n;i++){ if(vis[i]==false){ //发现这个是素数原创 2021-04-20 09:27:05 · 762 阅读 · 2 评论 -
第十二届蓝桥杯参赛感想
写在前面,这次蓝桥杯基本没有准备,原因是参加我们学校家园工作室举办的hackweek,即时是考前半个小时还在部署自己写好的项目,反正就是那种书都不看的情况。本次蓝桥杯说实话,感觉这次的省赛的难度比以往大了很多,以往的题目大部分都是靠模拟出来的,会搜索基本就能拿省一,但是这次的感觉会搜索只能签到,会DP应该勉强才能省一。首先,本人参加的是CA组,先来说一下我的做题情况,第一题应该没啥问题,直接for循环模拟过去,知道遇到第一个不满足的情况即可。第二题,我是先暴力枚举任意两个点的坐标,然后记录他们的斜率和精原创 2021-04-20 08:36:22 · 525 阅读 · 0 评论 -
Educational Codeforces Round 106 (Rated for Div. 2) C. Minimum Grid Path
题意:在一个二维坐标系中,我们从(0,0)到(n,n),中途最多可以转弯n-1次,当然可以转更少次的弯,每次转弯都有一个消耗值。问到达(n,n)消耗值最小是多少?思路:首先,我们发现,奇数和偶数可以单独分开来,他们之间是不影响的。我们很容易就能想到我们可以枚举到达终点的转弯的位置。然后注意,这之后的都没有必要考虑了。(这是一个坑点),对于前面的,我们可以预处理出每个方向的每个位置之前出现数字的最小值。同时计算一下每次转弯的前缀和。之前的步数我们只要走一步就行了。然后剩余的步数都是由每个方向的最小值的走完原创 2021-04-11 12:53:46 · 103 阅读 · 0 评论 -
P1450 [HAOI2008]硬币购物
题意:给出四种硬币的面值,然后给出四种银币的数量,最后给出一个总的金额s。让我们求不同的选取方案数使得总金额加起来为s。思路:1、暴力破解, 四重for循环,时间复杂度O(N^4),直接白给。2、先求两两组合而成的可能的总面值,然后用一个map记录该金额对应的选取个数,最后从1-1e5进行枚举,时间复杂度为O(N^2)。3、背包+容斥+差分。这个题目,我们发现从正面求的话时间复杂度很高,因为有数量的限制。那么我们反其道而行之。我们先用完全背包求没有限制的方案数,然后减去限制一个的方案数,加上限制两个原创 2021-04-10 09:52:28 · 229 阅读 · 0 评论 -
ACM算法知识整理(字符串和数学)
目前大二,弱校ACMer。队友们都希望在接下来的区域赛取得好成绩。所以现在打算分工每个人主攻几个算法考点,我被分配到了字符串和数学。在队友的建议下我决定做一个知识点的总结,有个计划目标总是好的。数学类位运算整除相关素数+ 埃式筛+ 线性筛+ Min25筛最大公约数欧拉函数同余方程线性同余方程&乘法逆元中国剩余定理高次同余方程博弈论巴什博弈威佐夫博奕Fibonacci博弈尼姆博弈公平组合博弈(Impartial Combinatori Games)原创 2021-03-26 21:43:47 · 207 阅读 · 1 评论