吉林大学ACM竞赛代码库:图论与网络流算法概览

需积分: 12 3 下载量 72 浏览量 更新于2024-07-26 收藏 659KB PDF 举报
"acm模板总汇.pdf" 这篇文档是一个关于ACM竞赛编程的代码模板集合,主要涵盖了图论、网络流和数据结构等核心算法。这些模板来自于吉林大学计算机科学与技术学院2005级的ACM团队,并在之后的年份中进行了修订和完善。 在图论部分,文档包含了各种经典算法的实现。例如,DAG(有向无环图)的深度优先搜索标记用于遍历无环图;寻找无向图中的“桥”——断开连接后会导致图不连通的边;无向图连通度计算,用于确定图的连通分量;最大团问题通过动态规划和DFS解决,找到图中最大的完全子图;欧拉路径的算法用于寻找能遍历所有边且仅遍历一次的路径;Dijkstra算法有两种实现,一种是基于数组,时间复杂度为O(N^2),另一种是优化过的,时间复杂度为O(E*logE),用于找出图中从起点到其他所有点的最短路径;Bellman-Ford算法用于处理负权边,找出单源最短路径,时间复杂度为O(VE);SPFA(Shortest Path Faster Algorithm)是另一种Dijkstra的优化实现;第K短路问题,既可以使用Dijkstra也可以用A*算法来解决;Prim算法用于构建最小生成树,次小生成树算法则在保持最小生成树性质的基础上寻找第二小的生成树;最小生成森林问题处理多棵树的情况,时间复杂度为O(M*logM);有向图最小树形图(Minimal Steiner Tree)是寻找连接所有顶点的最小树形结构;Tarjan算法用于识别图中的强连通分量;弦图的判断和完美消除序列是图论中的特殊问题;稳定婚姻问题利用Gale-Shapley算法,可以找到稳定的匹配方案;拓扑排序用于无向图或有向无环图的顶点排序;无向图连通分支和有向图强连通分支的检测可以通过DFS或BFS实现;有向图最小点基算法寻找图的最小支撑树;Floyd算法用于寻找图中任意两点间的最短路径;2-SAT问题是一种布尔逻辑问题,通过特定算法可快速判断是否存在满足条件的解。 网络流部分主要涉及流网络的算法。二分图匹配的三种实现包括DFS和BFS版本的匈牙利算法以及Hopcroft-Carp的算法,它们都用于在二分图中寻找最大匹配;Kuhn-Munkres算法用于寻找二分图的最佳匹配,即最大匹配;无向图最小割算法寻找能分割图的最小边集合;有上下界限制的最小(最大)流问题,以及Dinic和HLPP算法分别用于求解最大流,它们的时间复杂度分别为O(V^2*E)和O(V^3);最小费用流问题考虑了边上的成本,有多种高效实现,包括两种不同的O(V*E*F)复杂度的算法;最佳边割集、最佳点割集、最小边割集和最小点割集是网络流问题的扩展,分别对应不同场景下的最优解;最小路径覆盖问题寻找最少的路径数覆盖所有顶点;而最小点集覆盖问题则是寻找最少的顶点集合来覆盖所有边。 数据结构部分,模板中可能包含了求解特定日期是星期几的算法,以及其他数据结构相关的实用技巧和问题解决方案。 这些模板对于参与ACM竞赛的选手或者需要解决图论、网络流和数据结构问题的程序员来说是非常宝贵的资源,它们提供了高效的代码实现,有助于快速理解和解决相关问题。
2019-10-07 上传
看大小就知道很全啦 查看地址 https://blog.csdn.net/qq_43333395/article/details/98508424 目录: 数据结构: 1.RMQ (区间最值,区间出现最大次数,求区间gcd) 2.二维RMQ求区间最大值 (二维区间极值) 3.线段树模板(模板为区间加法) (线段树染色) (区间最小值) 4.线性基 (求异或第k大) 5.主席树(静态求区间第k小) (区间中小于k的数量和小于k的总和) (区间中第一个大于或等于k的值) 6.权值线段树 (求逆序对) 7.动态主席树 (主席树+树状数组) (区间第k大带修改) 8.树上启发式合并 (查询子树的优化) 9,树状数组模板 (求区间异或和,求逆序对) 扩展 10.区间不重复数字的和 (树状数组) 11.求k维空间中离所给点最近的m个点,并按顺序输出(KD树) 12.LCA (两个节点的公共父节点) 动态规划: 1.LIS (最长上升子序列) 2.有依赖的背包 (附属关系) 3.最长公共子序列(LCS) 4.树形DP 5.状压DP-斯坦纳树 6.背包 7.dp[i]=min(dp[i+1]…dp[i+k]),multset 博弈: 1.NIM博弈 (n堆每次最少取一个) 2.威佐夫博弈(两堆每次取至少一个或一起取一样的) 3.约瑟夫环 4.斐波那契博弈 (取的数依赖于对手刚才取的数) 5.sg函数 数论: 1.数论 素数检验:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验 2.拉格朗日乘子法(求有等式约束条件的极值) 3.裂项(多项式分子分母拆分) 4.扩展欧几里得 (ax+by=c) 5.勾股数 (直角三角形三边长) 6.斯特林公式 (n越大越准确,求n!) 7.牛顿迭代法 (求一元多次方程一个解) 8.同余定理 (a≡b(mod m)) 9.线性求所有逆元的方法求 (1~p modp的逆元) 10.中国剩余定理(n个同余方程x≡a1(modp1)) 11.二次剩余((ax+k)2≡n(modp)(ax+k)^2≡n(mod p)(ax+k) 2 ≡n(modp)) 12.十进制矩阵快速幂(n很大很大的时候) 13.欧拉函数 14.费马小定理 15.二阶常系数递推关系求解方法 (a_n=p*a_{n-1}+q*a_{n-2}) 16.高斯消元 17.矩阵快速幂 18.分解质因数 19.线性递推式BM(杜教) 20.线性一次方程组解的情况 21.求解行列式的逆矩阵,伴随矩阵,矩阵不全随机数不全 组合数学: 1.循环排列 (与环有关的排列组合) 计算几何: 1.三角形 (求面积)) 2.多边形 3.三点求圆心和半径 4.扫描线 (矩形覆盖求面积) (矩形覆盖求周长) 5.凸包 (平面上最远点对) 6.求凸多边形的直径 7.求凸多边形的宽度 8.求凸多边形的最小面积外接矩形 9.半平面交 图论: 基础:前向星 1.最短路(优先队列dijkstra) 2.判断环(tarjan算法) 3.最小生成树(Kruskal 模板) 4.最小生成树(Prim) 5.Dicnic最大流(最小割) 6.无向图最小环(floyd) 7.floyd算法的动态规划(通过部分指定边的最短路) 8.图中找出两点间的最长距离 9.最短路 (spfa) 10.第k短路 (spfa+A*) 11.回文树模板 12.拓扑排序 (模板) 13.次小生成树 14.最小树形图(有向最小生成树) 15.并查集 (普通并查集,带权并查集,) 16.求两个节点的最近公共祖先 (LCA) 17.限制顶点度数的MST(k度限制生成树) 18.多源最短路(spfa,floyd) 19.最短路 (输出字典序最小) 20.最长路 图论题目简述 字符串: 1.字典树(多个字符串的前缀) 2.KMP(关键字搜索) 3.EXKMP(找到S中所有P的匹配) 4.马拉车(最长回文串) 5.寻找两个字符串的最长前后缀(KMP) 6.hash(进制hash,无错hash,多重hash,双hash) 7.后缀数组 (按字典序排字符串后缀) 8.前缀循环节(KMP的fail函数) 9.AC自动机 (n个kmp) 10.后缀自动机 小技巧: 1.关于int,double强转为string 2.输入输出挂 3.低精度加减乘除 4.一些组合数学公式 5.二维坐标的离散化 6.消除向下取整的方法 7.一些常用的数据结构 (STL) 8.Devc++的使用技巧 9.封装好的一维离散化 10.Ubuntu对拍程序 11.常数 12.Codeblocks使用技巧 13.java大数 叮嘱 共173页