"ACMICPC 代码库包含了各种算法和数据结构,主要集中在图论、网络流和数据结构等领域,适用于解决ACM/ICPC竞赛中的编程问题。这份文档由吉林大学ACMGroup1成员创建并修订,提供了丰富的算法实现和优化策略。"
在图论部分,代码库涵盖了以下知识点:
1. **DAG的深度优先搜索标记**:用于遍历有向无环图(DAG),标记节点访问状态,常用于寻找路径或计算环。
2. **无向图找桥**:查找图中的桥(断点),桥是使得去掉后增加连通分量的边。
3. **无向图连通度(割)**:计算图的连通分量和割点,评估图的连通性。
4. **最大团问题**:利用动态规划(DP)和深度优先搜索(DFS)寻找图中最大的完全子图。
5. **欧拉路径O(E)**:找到起点到终点的欧拉路径,如果图允许则构建欧拉回路。
6. **DIJKSTRA算法**:两种实现,一种是数组实现O(N^2),另一种是使用优先队列实现O(E * LOG E),用于寻找图中单源最短路径。
7. **BELLMAN-FORD算法**:单源最短路算法,能处理负权边,时间复杂度为O(VE)。
8. **SPFA算法**:较快速的迪杰斯特拉变体,但可能不是最精确,用于求解单源最短路径。
9. **第K短路**:通过DIJKSTRA或A*算法扩展,找到除了最短路径之外的第K短路径。
10. **PRIM算法**:求解最小生成树(MST),可以使用Prim-Jarník或Kruskal算法,这里针对最小生成树问题。
11. **次小生成树O(V^2)**:寻找次优的生成树,可能与最小生成树不同。
12. **最小生成森林问题**:当图包含多棵树时,寻找最小生成森林,通常使用Kruskal算法实现O(MLOGM)。
13. **有向图最小树形图**:在有向图中寻找一棵最小树形图,即满足所有节点到根节点的路径是唯一的。
14. **MINIMAL STEINER TREE**:在图中寻找一个最小的树形结构,连接特定的一组节点。
15. **TARJAN强连通分量**:用于识别有向图中的强连通分量,即每个节点都可以到达其他所有节点的子图。
16. **弦图判断及PERFECT ELIMINATION点排列**:弦图是满足特定性质的图,PERFECT ELIMINATION点排列是消除图的一种特殊操作。
在网络流部分,涉及的算法包括:
1. **二分图匹配**:使用匈牙利算法、Hopcroft-Carp算法和Kuhn-Munkres算法实现,找到二分图中最大的匹配。
2. **最小割**:在无向图中寻找最小割,可以用于分割图或解决某些优化问题。
3. **最大流**:Dinic算法和HLPP算法分别提供O(V^2*E)和O(V^3)的时间复杂度,用于求解网络中的最大流量。
4. **最小费用流**:寻找具有最小总费用的可行流,有O(V*E*F)和O(V^2*F)两种实现。
5. **最佳边割集、最佳点割集、最小边割集、最小点割集**:与网络流相关,用于优化网络性能。
在数据结构部分,涵盖了一些基本操作和算法,如:
1. **求某天是星期几**:根据日期计算星期。
2. **拓扑排序**:对有向无环图进行排序,使得所有边都指向排序后的后继节点。
3. **无向图连通分支(DFS/BFS邻接阵)**:用深度优先搜索或广度优先搜索找出图的连通分支。
4. **有向图强连通分支(DFS/BFS邻接阵)**:识别有向图中的强连通分支。
5. **有向图最小点基(邻接阵)**:寻找有向图的最小点基,涉及图的矩阵表示。
以上内容详细介绍了ACMICPC代码库中关于图论、网络流和数据结构的主要算法和应用,为ACM/ICPC竞赛提供了解题思路和实现方法。