ACM
收纳ACM备赛的相关算法与练习题
Hacker_Z&Q
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Dilworth定理的证明
要么构成全上界,要么构成全下界。中每个最长反链的元素个数都较。是偏序集的一个子集,如果。中元素互相可比,那么称。中元素互相不可比,则称。时,这个结论显然成立;时定理成立,我们来证明。一定包含在全上界,因此。,从而由归纳假设知,:对于每一个最长反链。:对任意有限偏序集,其。:对任意有限偏序集,其。原创 2025-06-27 22:43:38 · 226 阅读 · 0 评论 -
队列
什么是队列? 队列就是一种先进先出的数据结构,如下图。(画风不好) 我们来试着存一下队列:#include<bits/stdc++.h>using namespace std;int f,l,n,a[10001];int main(){ scanf("%d",&n);for(int i=1;i<=n;i++){ a[++l]=i;}...原创 2018-12-09 21:15:08 · 145 阅读 · 0 评论 -
链式前向星存图与拓扑排序
可是仅仅如此,是无法做到有顺序的遍历的,所以,我们需要取用一个head数组,用head[u]描述所有以u为头节点存储的最后一条边,并且将所有以u为头结点的边用.next串联,从而达到遍历的效果。对象是有向无环图,而拓扑排序的目的,就是找到一个遍历,使得其遍历了所有的点,则这个点的顺序称为一种拓扑排序。其算法思路为:先找到所有入度为0的点,存入队列中,再将这些点全部删去,然后在图中再次找出所有入度为0的点,循环往复。鉴于拓扑排序的考虑对象在点,不便于用链式前向星存储,故采用点为主体的链表结构。原创 2024-09-08 20:36:02 · 268 阅读 · 0 评论 -
强连通分量
而一张图中的子图如果联通,我们称之为该图的强连通分量。强连通:有向图中任意两个点可以相互抵达。连通:图中任意两个点可以相互抵达。原创 2024-09-09 08:45:23 · 244 阅读 · 0 评论 -
SPFA+Dijkstra优化
SPFA+Dijkstra优化 其实就是用优先队列对SPFA进行优化的一种算法优化。而SPFA的基本思路为:用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图G。设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队...原创 2019-02-13 22:02:52 · 557 阅读 · 0 评论 -
从溢出视角看补码
CPU并没有减法运算器,而计算机对减法的处理需要则用到补码,从而实现将二进制数的减法转化为加法运算,以达到电路设计的目的。计算机对二进制数的加法运算有溢出的特点,那么可以考虑将减法通过加法溢出达到相同的效果。由上述过程,说明了补码相加即利用了计算机二进制数的溢出实现减法过程。举个例子,8 bit 二进制数 的计算在取值达到。正数的补码、原码和反码相同;负数的反码符号位为"的补码相加,在数值上等价于。恰好溢出,相当于结果对。原创 2024-07-07 22:48:09 · 264 阅读 · 0 评论 -
二分图匹配
首先,什么是二分图?——二分图,顾名思义,就是由两个子集组成的特殊图论模型,如下图可以将大写字母看作男生,将小写字母看作女生,则A男生与b女生之间有好感,且C男生与b女生之间也有好感。那么,二分图匹配又有什么用?——二分图匹配主要用于寻找增广路径的运算,接下来我们就来介绍一种算法:匈牙利算法!比如说上图(还是那张恶心的图......),A男生与b女生之间有好感,可是男生与b...原创 2018-10-15 23:47:39 · 174 阅读 · 0 评论 -
证明补码下,~n=-n-1
10运算表示的就是将正数 10 的补码转换为负数 10 的补码,而非简单的由 “00001010” 变为 “10001010”,因为 “10001010” 是 “-10” 的原码,而计算机的处理用的是补码,故为 “11110110”,故左右相等,证毕。10 的原码是 “00001010”,为正数,所以输入后 10 的补码也是 “00001010” ,接下来计算机的运算是补码运算,~10+1 =~n = -n-1,等价于证明~n+1 = -n,以n=10作为例子;原创 2024-08-13 22:52:27 · 290 阅读 · 0 评论 -
[算法]排序
当待排序的序列中存在a[i]与a[j],且a[i]=a[j],在经过某算法排序后,a[i]与a[j]的相对位置不发生改变,例如a[i]在a[j]之前,排序过程中,a[i]一直在a[j]之前,则我们认为该排序算法是稳定的,以冒泡排序为例。其中,a[1..i]描述的就是“左手”中排列好的“牌”,也就是大小排好的序列,而a[i+1..n]则是待排序的“乱牌堆”;快速排序的思路,是选定一个标准数,将序列中比标准数小的扔到左边,将序列中比标准数大的扔到右边,再分别对左序列与右序列进行同样的操作。原创 2024-09-06 20:29:51 · 283 阅读 · 0 评论 -
*割点割桥
【代码】*割点割桥。原创 2024-09-09 21:01:38 · 177 阅读 · 1 评论 -
倍增LCA
其实这个LCA没啥优化(主要是因为博主太弱了QwQ)首先,什么是LCA? : 指在有根树中,找出某两个结点u和v最近的公共祖先。那什么是倍增呢? : 是指将在树上的u点与v点同时向上传递时,每次不是指移一位,而是移位从而大大提高时间效率。(预处理为O(nlogn),之后的挨次询问为O(logn) )。(为了时间,我二话不说地使用了链式向前星与快读QwQ)...原创 2019-08-16 23:14:16 · 139 阅读 · 0 评论 -
dijstra+链式前向星+优先队列优化
dijstra——强大的算法dijstra+链式前向星+优先队列优化=满分的最短路由于SPFA在最坏情况下会退化,所以我决定使用dijstra来解决最短路问题。链式前向星就是存图用的,比邻接矩阵节省空间得多(点这)而由于dijstra是基于贪心的,所以也可以用优先队列来维护写个模板吧:#include<bits/stdc++.h>#define FOR(i,...原创 2019-08-13 19:36:32 · 631 阅读 · 0 评论 -
拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。 1.每个顶点出现且只出现一次。2.若存在一条从顶点 A 到顶点 B ,则A为B的前序...原创 2018-10-02 23:27:02 · 127 阅读 · 0 评论 -
二叉树——kruskal
~~已会各位大佬们可以跳过QwQ~~ , 今天我们用Kruskal算法来解这道题。1. 定义 int fa[1000100],i,j,k,n,m,s,ans;//基本变量:) struct eige{ int x,y,z;}a[1000100];//主要是为了排序2. 排序函数定 int cmp(eige u,eige v){ return ...原创 2018-10-16 19:22:27 · 199 阅读 · 0 评论 -
单源最短路径----prim算法
这一题是用二维数组将点存入。 scanf("%d%d%d",&x,&y,&z); if(a[x][y]!=0){ a[x][y]=min(a[x][y],z); } else a[x][y]=z;至于那个判断则是判重边啦。先将每个点的权值赋最大(d数组存点的值)。const int inf=100000000;......for(i=1;i...原创 2018-10-23 21:12:22 · 1018 阅读 · 0 评论 -
谈论贪心
欢迎各位于百忙之中来看我的算法博客,这主要是为新手准备的资料,而会的大佬可以忽略。贪心算法是一种策略算法,没有特定格式,用策略求解即可。首先,使用贪心算法要满足该问题的局部解可以满足全局最优解。 举个栗子例子:现在有X个包,每个包有Y种物品,每个物品的价格为z[x][y],现在从每个包里拿出N个物品,如何使总价值最大? 如: X=3,Y=2,N=1;z[x][y]=(3 4) (5...原创 2018-10-23 21:07:41 · 155 阅读 · 0 评论
分享