ACM所有算法


ACM 所有算法

数据结构
  • 栈,队列,链表
  • 哈希表,哈希数组
  • 堆,优先队列

    双端队列

    可并堆

    左偏堆

  • 二叉查找树

    Treap

    伸展树

  • 并查集

    集合计数问题

    二分图的识别

  • 平衡二叉树
  • 二叉排序树
  • 线段树

    一维线段树

    二维线段树

  • 树状数组

    一维树状数组

    N维树状数组

  • 字典树
  • 后缀数组,后缀树
  • 块状链表
  • 哈夫曼树
  • 桶,跳跃表
  • Trie树(静态建树、动态建树)
  • AC自动机
  • LCA和RMQ问题
  • KMP算法
图论
  • 基本图算法图

    广度优先遍历

    深度优先遍历

    拓扑排序

    割边割点

    强连通分量

    Tarjan算法

    双连通分量

    强连通分支及其缩点

    图的割边和割点

    最小割模型、网络流规约

    2-SAT问题

    欧拉回路

    哈密顿回路

  • 最小生成树

    Prim算法

    Kruskal算法(稀疏图)

    Sollin算法

    次小生成树

    第k小生成树

    最优比例生成树

    最小树形图

    最小度限制生成树

    平面点的欧几里德最小生成树

    平面点的曼哈顿最小生成树

    最小平衡生成树

  • 最短路径

    有向无环图的最短路径->拓扑排序

    非负权值加权图的最短路径->Dijkstra算法(可使用二叉堆优化)

    含负权值加权图的最短路径->Bellmanford算法

    含负权值加权图的最短路径->Spfa算法

    (稠密带负权图中SPFA的效率并不如Bellman-Ford高)

    全源最短路弗洛伊德算法Floyd

    全源最短路Johnson算法

    次短路径

    第k短路径

    差分约束系统

    平面点对的最短路径(优化)

    双标准限制最短路径

  • 最大流

    增广路->Ford-Fulkerson算法

    预推流

    Dinic算法

    有上下界限制的最大流

    节点有限制的网络流

    无向图最小割->Stoer-Wagner算法

    有向图和无向图的边不交路径

    Ford-Fulkerson迭加算法

    含负费用的最小费用最大流

  • 匹配

    Hungary算法

    最小点覆盖

    最小路径覆盖

    最大独立集问题

    二分图最优完备匹配Kuhn-Munkras算法

    不带权二分匹配:匈牙利算法

    带权二分匹配:KM算法

    一般图的最大基数匹配

    一般图的赋权匹配问题

  • 拓扑排序
  • 弦图
  • 稳定婚姻问题
搜索
  • 广搜的状态优化

    利用M进制数存储状态

    转化为串用hash表判重

    按位压缩存储状态

    双向广搜

    A*算法

  • 深搜的优化

    位运算

    剪枝

    函数参数尽可能少

    层数不易过大

    双向搜索或者是轮换搜索

    IDA*算法

  • 记忆化搜索
动态规划
  • 四边形不等式理论
  • 不完全状态记录

    青蛙过河问题

    利用区间dp

  • 背包类问题

    0-1背包,经典问题

    无限背包,经典问题

    判定性背包问题

    带附属关系的背包问题

    + -1背包问题

    双背包求最优值

    构造三角形问题

    带上下界限制的背包问题(012背包)

  • 线性的动态规划问题

    积木游戏问题

    决斗(判定性问题)

    圆的最大多边形问题

    统计单词个数问题

    棋盘分割

    日程安排问题

    最小逼近问题(求出两数之比最接近某数/两数之和等于某数等等)

    方块消除游戏(某区间可以连续消去求最大效益)

    资源分配问题

    数字三角形问题

    漂亮的打印

    邮局问题与构造答案

    最高积木问题

    两段连续和最大

    2次幂和问题

    N个数的最大M段子段和

    交叉最大数问题

  • 判定性问题的dp(如判定整除、判定可达性等)

    模K问题的dp

    特殊的模K问题,求最大(最小)模K的数

    变换数问题

  • 单调性优化的动态规划

    1-SUM问题

    2-SUM问题

    序列划分问题(单调队列优化)

  • 剖分问题(多边形剖分/石子合并/圆的剖分/乘积最大)

    凸多边形的三角剖分问题

    乘积最大问题

    多边形游戏(多边形边上是操作符,顶点有权值)

    石子合并(N^3/N^2/NLogN各种优化)

  • 贪心的动态规划

    最优装载问题

    部分背包问题

    乘船问题

    贪心策略

    双机调度问题Johnson算法

  • 状态dp

    牛仔射击问题(博弈类)

    哈密顿路径的状态dp

    两支点天平平衡问题

    一个有向图的最接近二部图

  • 树型dp

    完美服务器问题(每个节点有3种状态)

    小胖守皇宫问题

    网络收费问题

    树中漫游问题

    树上的博弈

    树的最大独立集问题

    树的最大平衡值问题

    构造树的最小环


数学

数论
  • 中国剩余定理
  • 欧拉函数
  • 欧几里得定理
  • 欧几里德辗转相除法求GCD(最大公约数)
  • 扩展欧几里得
  • 大数分解与素数判定
  • 佩尔方程
  • 同余定理(大数求余)
  • 素数测试

    一千万以内:筛选法

    一千万以外:米勒测试法

  • 连分数逼近
  • 因式分解
  • 循环群生成元
  • 素数与整除问题
  • 进制位.
  • 同余模运算
组合数学
  • 排列组合
  • 容斥原理
  • 递推关系和生成函数
  • Polya计数法

    Polya计数公式

    Burnside定理

  • N皇后构造解
  • 幻方的构造
  • 满足一定条件的hamilton圈的构造
  • Catalan数
  • Stirling数
  • 斐波拉契数
  • 调和数
  • 连分数
  • MoBius反演
  • 偏序关系理论
  • 加法原理和乘法原理
计算几何
  • 基本公式

    叉乘

    点乘

    常见形状的面积、周长、体积公式

    坐标离散化

  • 线段

    判断两线段(一直线、一线段)是否相交

    求两线段的交点

  • 多边形

    判定凸多边形,顶点按顺时针或逆时针给出,(不)允许相邻边共线

    判点在凸多边形内或多边形边上,顶点按顺时针或逆时针给出

    判点在凸多边形内,顶点按顺时针或逆时针给出,在多边形边上返回0

    判点在任意多边形内,顶点按顺时针或逆时针给出

    判线段在任意多边形内,顶点按顺时针或逆时针给出,与边界相交返回1

    多边形重心

    多边形切割(半平面交)

    扫描线算法

    多边形的内核

  • 三角形

    内心

    外心

    重心

    垂心

    费马点

  • 判直线和圆相交,包括相切

    判线段和圆相交,包括端点和相切

    判圆和圆相交,包括相切

    计算圆上到点p最近点,如p与圆心重合,返回p本身

    计算直线与圆的交点,保证直线与圆有交点

    计算线段与圆的交点可用这个函数后判点是否在线段上

    计算圆与圆的交点,保证圆与圆有交点,圆心不重合

    计算两圆的内外公切线

    计算线段到圆的切点

    点集最小圆覆盖

  • 可视图的建立
  • 对踵点
  • 经典问题

    平面凸包

    三维凸包

    Delaunay剖分/Voronoi图

计算方法
  • 二分法

    二分法求解单调函数相关知识

    用矩阵加速的计算

  • 迭代法
  • 三分法
  • 解线性方程组

    LUP分解

    高斯消元

  • 解模线性方程组
  • 定积分计算
  • 多项式求根
  • 周期性方程
  • 线性规划
  • 快速傅立叶变换
  • 随机算法
  • 0/1分数规划
  • 三分法求解单峰(单谷)的极值
  • 迭代逼近
  • 矩阵法
博弈论
  • 极大极小过程
  • Nim问题

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-15 03:45:23

ACM所有算法的相关文章

《ACM/ICPC 算法训练教程》读书笔记一之数据结构(堆)

书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了集训队final的意见买的,感觉还是不错滴. 相对于其他ACM书籍来说,当然如书名所言,这是一本算法训练书,有着大量的算法实战题目和代码,尽管小编还是发现了些许错误= =,有部分注释的语序习惯也有点不太合我的胃口.实战题目较多是比较水的题,但也正因此才能帮助不少新手入门,个人认为还是一本不错的算法书,当然自学还是需要下不少

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

ACM/ICPC算法训练 之 数学很重要-浅谈“排列计数” (DP题-POJ1037)

这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列计数 的方法,虽然排列计数的思路简单,但却是算法中一个数学优化的点睛之笔. Poj1037  A decorative fence 题意:有K组数据(1~100),每组数据给出总木棒数N(1~20)和一个排列数C(64位整型范围内),N个木棒长度各异,按照以下条件排列,并将所有可能结果进行字典序排序 1.每一

《ACM/ICPC 算法训练教程》读书笔记 之 数据结构(线段树详解)

依然延续第一篇读书笔记,这一篇是基于<ACM/ICPC 算法训练教程>上关于线段树的讲解的总结和修改(这本书在线段树这里Error非常多),但是总体来说这本书关于具体算法的讲解和案例都是不错的. 线段树简介 这是一种二叉搜索树,类似于区间树,是一种描述线段的树形数据结构,也是ACMer必学的一种数据结构,主要用于查询对一段数据的处理和存储查询,对时间度的优化也是较为明显的,优化后的时间复杂为O(logN).此外,线段树还可以拓展为点树,ZWK线段树等等,与此类似的还有树状数组等等. 例如:要将

ACM中算法复杂度估算经验

OJ和正式的比赛一定会写明评测机各参数的,如果只是想比较准确的知道实际评测的效率,可以搞一些无聊的大递归交上去试试(比如1e8次求mod),最多不过几个TLE/WA而已.好在大家的机器基本上差不多,除非碰到恶意卡常数的情况,否则凭借一般人的常识足够了(比如1e4^2脸没洗好不要试,几e6的规模nlgn多半能赌一下常数和数据放水,1e8线性算法交之前看好自己的常数,再大就想想sqrt和log). 自己代码的话:有个好方法:随便来个极限数据,拿自己的机器跑一下(如果你觉得自己的机器太快,可以将自机的

acm 1002 算法设计

最近突然想往算法方向走走,做了做航电acm的几道题 二话不说,开始 航电acm 1002 题主要是处理长数据的问题,算法原理比较简单,就是用字符数组代替int,因为int太短需要处理的数据较长 下面是问题描述: Problem Description I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.   Input The fir

ACM/ICPC算法训练 之 数学问题

好歹我是数学专业的学生,还是要写写训练的时候遇到的数学问题滴~~ 在ACM集训的时候在各高校OJ上也遇见过挺多的数学问题,例如大数的处理,素数的各种算法,几何问题,函数问题(单调,周期等性质),甚至是各种数学定理或公式的变形.其实算法本身也属于数学研究的范畴(计算机本就是数学的衍生嘛),诸如众多排序算法,搜索算法也是许多精巧的数学逻辑思维,所以大家学计算机千万别忽视数学这门基础学科啊. 貌似说了好多废话= =||,待小编进入正题,今天在湖大OJ训练赛上看到一道数学题,话不多说,直接上图! ___

ACM/ICPC算法训练 之 BFS-广搜进阶-八数码(经典)(POJ1077+HDU1043)

八数码问题也称为九宫问题.(本想查查历史,结果发现居然没有词条= =,所谓的历史也就不了了之了) 在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格,与空格相邻的棋子可以移到空格中.要求解决的问题是: 给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤. 所谓问题的一个状态就是棋子在棋盘上的一种摆法.棋子移动后,状态就会发生改变.解八数码问题就是找出从初状态到目标状态所经过的一系列中间状态.八数码问题一

ACM/ICPC 算法训练 之 &quot;打表&quot;思路(防超时) ——附加素数筛选法

何为"打表"呢,说得简单点就是: 有时候与其重复运行同样的算法得出答案,还不如直接用算法把这组数据所有可能的答案都枚举出来存到一个足够大的容器中去-例如数组(打表),然后再输入数据的时候,直接遍历容器,检索这个数据是否有题意要求的结果. 举一个几乎所有程序员都知道的简单例子= =: 求素数(POJ 1595)-Prime cuts 这一题大意是给出 多组N(1~1000)和C,让你从N内素数的中间项向外扩展C个素数,比如给出7 1,素数有5个(注意此题出题人坑爹得让1作为"素