1. 程式人生 > >ACM主要演算法

ACM主要演算法

ACM主要演算法


ACM主要演算法介紹

初期篇

一、基本演算法
(1)列舉(poj1753, poj2965)
(2)貪心(poj1328, poj2109, poj2586)
(3)遞迴和分治法
(4)遞推
(5)構造法(poj3295)
(6)模擬法(poj1068, poj2632, poj1573, poj2993, poj2996)
二、圖演算法
(1)圖的深度優先遍歷和廣度優先遍歷
(2)最短路徑演算法(dijkstra, bellman-ford, floyd, heap+dijkstra)(poj1860, poj3259, poj1062, poj2253, poj1125, poj2240)
(3)最小生成樹演算法(prim, kruskal)(poj1789, poj2485, poj1258, poj3026)
(4)拓撲排序(poj1094)
(5)二分圖的最大匹配(匈牙利演算法)(poj3041, poj3020)
(6)最大流的增廣路演算法(KM演算法)(poj1459, poj3436)
三、資料結構

(1)串(poj1035, poj3080, poj1936)
(2)排序(快排、歸併排(與逆序數有關)、堆排)(poj2388, poj2299)
(3)簡單並查集的應用
(4)雜湊表和二分查詢等高效查詢法(數的Hash, 串的Hash)(poj3349, poj3274, POJ2151, poj1840, poj2002, poj2503)
(5)哈夫曼樹(poj3253)
(6)堆
(7)trie樹(靜態建樹、動態建樹)(poj2513)
四、簡單搜尋
(1)深度優先搜尋(poj2488, poj3083, poj3009, poj1321, poj2251)
(2)廣度優先搜尋(poj3278, poj1426, poj3126, poj3087, poj3414)
(3)簡單搜尋技巧和剪枝(poj2531, poj1416, poj2676, 1129)
五、動態規劃

(1)揹包問題(poj1837, poj1276)
(2)型如下表的簡單DP(可參考lrj的書page149):
1.E[j]=opt{D+w(i,j)} (poj3267, poj1836, poj1260, poj2533)
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列)(poj3176, poj1080, poj1159)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]} (最優二分檢索樹問題)
六、數學
(1)組合數學
1.加法原理和乘法原理
2.排列組合
3.遞推關係(poj3252, poj1850, poj1019, poj1942)
(2)數論
1.素數與整除問題
2.進位制位
3.同餘模運算(poj2635, poj3292, poj1845, poj2115)
(3)計算方法
1.二分法求解單調函式相關知識(poj3273, poj3258, poj1905, poj3122)
七、計算幾何學

(1)幾何公式
(2)叉積和點積的運用(如線段相交的判定,點到線段的距離等)(poj2031, poj1039)
(3)多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)(poj1408, poj1584)
(4)凸包(poj2187, poj1113)

中級篇
一、基本演算法
(1)C++的標準模版庫的應用(poj3096, poj3007)
(2)較為複雜的模擬題的訓練(poj3393, poj1472, poj3371, poj1027, poj2706)
二、圖演算法
(1)差分約束系統的建立和求解(poj1201, poj2983)
(2)最小費用最大流(poj2516, poj2195)
(3)雙連通分量(poj2942)
(4)強連通分支及其縮點(poj2186)
(5)圖的割邊和割點(poj3352)
(6)最小割模型、網路流規約(poj3308)
三、資料結構
(1)線段樹(poj2528, poj2828, poj2777, poj2886, poj2750)
(2)靜態二叉檢索樹(poj2482, poj2352)
(3)樹狀樹組(poj1195, poj3321)
(4)RMQ(poj3264, poj3368)
(5)並查集的高階應用(poj1703, 2492)
(6)KMP演算法(poj1961, poj2406)
四、搜尋
(1)最優化剪枝和可行性剪枝
(2)搜尋的技巧和優化(poj3411, poj1724)
(3)記憶化搜尋(poj3373, poj1691)
五、動態規劃
(1)較為複雜的動態規劃(如動態規劃解特別的施行商問題等)(poj1191, poj1054, poj3280, poj2029, poj2948, poj1925, poj3034)
(2)記錄狀態的動態規劃(poj3254, poj2411, poj1185)
(3)樹型動態規劃(poj2057, poj1947, poj2486, poj3140)
六、數學
(1)組合數學
1.容斥原理
2.抽屜原理
3.置換群與Polya定理(poj1286, poj2409, poj3270, poj1026)
4.遞推關係和母函式
(2)數學
1.高斯消元法(poj2947, poj1487, poj2065, poj1166, poj1222)
2.概率問題(poj3071, poj3440)
3.GCD、擴充套件的歐幾里德(中國剩餘定理)(poj3101)
(3)計算方法
1.0/1分數規劃(poj2976)
2.三分法求解單峰(單谷)的極值
3.矩陣法(poj3150, poj3422, poj3070)
4.迭代逼近(poj3301)
(4)隨機化演算法(poj3318, poj2454)
(5)雜題(poj1870, poj3296, poj3286, poj1095)
七、計算幾何學
(1)座標離散化
(2)掃描線演算法(例如求矩形的面積和周長,並常和線段樹或堆一起使用)(poj1765, poj1177, poj1151, poj3277, poj2280, poj3004)
(3)多邊形的核心(半平面交)(poj3130, poj3335)
(4)幾何工具的綜合應用(poj1819, poj1066, poj2043, poj3227, poj2165, poj3429)


高階篇

一、基本演算法要求
(1)程式碼快速寫成,精簡但不失風格(poj2525, poj1684, poj1421, poj1048, poj2050, poj3306)
(2)保證正確性和高效性(poj3434)
二、圖演算法
(1)度限制最小生成樹和第K最短路(poj1639)
(2)最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)(poj3155,  poj2112, poj1966, poj3281, poj1087, poj2289, poj3216, poj2446)
(3)最優比率生成樹(poj2728)
(4)最小樹形圖(poj3164)
(5)次小生成樹
(6)無向圖、有向圖的最小環
三、資料結構
(1)trie圖的建立和應用(poj2778)
(2)LCA和RMQ問題(LCA(最近公共祖先問題),有離線演算法(並查集+dfs)和線上演算法(RMQ+dfs))(poj1330)
(3)雙端佇列和它的應用(維護一個單調的佇列,常常在動態規劃中起到優化狀態轉移的目的)(poj2823)
(4)左偏樹(可合併堆)
(5)字尾樹(非常有用的資料結構,也是賽區考題的熱點)(poj3415,poj3294)
四、搜尋
(1)較麻煩的搜尋題目訓練(poj1069, poj3322, poj1475, poj1924, poj2049, poj3426)
(2)廣搜的狀態優化:利用M進位制數儲存狀態、轉化為串用hash表判重、按位壓縮儲存狀態、雙向廣搜、A*演算法(poj1768, poj1184, poj1872, poj1324, poj2046, poj1482)
(3)深搜的優化:儘量用位運算、一定要加剪枝、函式引數儘可能少、層數不易過大、可以考慮雙向搜尋或者是輪換搜尋、IDA*演算法(poj3131, poj2870, poj2286)
五、動態規劃
(1)需要用資料結構優化的動態規劃(poj2754, poj3378, poj3017)
(2)四邊形不等式理論
(3)較難的狀態DP(poj3133)
六、數學
(1)組合數學
1.MoBius反演(poj2888, poj2154)
2.偏序關係理論
(2)博奕論
1.極大極小過程(poj3317, poj1085)
2.Nim問題
七、計算幾何學
(1)半平面求交(poj3384, poj2540)
(2)可檢視的建立(poj2966)
(3)點集最小圓覆蓋
(4)對踵點(poj2079)

八、綜合題(poj3109, poj1478, poj1462, poj2729, poj2048, poj3336, poj3315, poj2148, poj1263)

附錄:

POJ是“北京大學程式線上評測系統”(Peking University Online Judge)的縮寫,是個提供程式設計題目的網站,相容Pascal、C、C++、Java、Fortran等多種語言。“北京大學程式線上評測系統”是一個免費的公益性網上程式設計題庫,網址為http://poj.grids.cn/及 http://acm.pku.edu.cn/JudgeOnline,它包含2000多道饒有趣味的程式設計題,題目大部分來自ACM國際大學生程式設計競賽,很多題目就反映工作和生活中的實際問題。使用者可以針對某個題目編寫程式並提交,讓POJ自動判定程式的對錯,幾秒之內即可知道對還是錯。


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