1. 程式人生 > >ACM必學演算法

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問題