2.5 图
- 图的表示 掌握用邻接表建图
- 最短路径:SPFA(队列实现,每次从队列中去除元素松弛); dijkstra(无负权边,分为两个集合,从未求出最短路径的集合中选出最小的松弛)
- 最小生成树:kruscal(从小到大的权值遍历边,并查集实现);prim(只与顶点有关,适合稠密图)
POJ 3255
求无向图顶点1到顶点n的次短路径。同一条边可以经过多次。
书上的做法是直接将最短路径的Dijkstra算法进行修改,对于每个顶点松弛的时候不仅松弛最短路,而且松弛次短路。我个人觉得这样的做法必须得用把路径存入到priority_queue中,再逐一出队松弛,否则每次寻找要松弛的顶点的判断条件较为繁琐。
另一种方法是根据从1->n的次短路经一定是顶点1到某个顶点P的最短路+P到顶点Q+Q到顶点n(相当于多走了一条路,这里的P可能为1,Q可能为n)。所以,我们仅需做顶点1到所有其它点的单源最短路径和顶点1到所有其它点的单源最短路径,两次Dijkstra或SPFA即可。
另外,无向图里面的数组大小要开边数的两倍。以及,有些边很多的图中可能会有重复边但权值不同的情况。
POJ 3723
征募女兵N人,男兵M人,每征募一个人需要10000$。但这些男女中,存在一些关系。如果在征募一个人时,在之前征募的人中存在和ta有关系的,那么征募费用要减去这些关系值的最大值。求最小征募费用。
把人看做顶点,关系看做边,最后的答案=10000*(n+m)- 最大生成树。
在做图论的题目时要注意顶点究竟是0…n-1,还是1…n,初始化的时候要小心。
2.1 搜索
- DFS
- BFS
- 栈与队列
POJ 2386
N*M的方阵,求多少连通的”W”(这里的连通可以是每个位置的八个方位,即不仅包括上下左右,还有左上、左下、右上、右下)
DFS,从每个”w”开始做DFS,每次找其八个方位的“w”,并把其用“.”代替。每个格子作为DFS的参数最多被调用一次,时间复杂度O(8*N*M)。
2.4 数据结构
- map,set
- queue,priority_queue,
- 并查集
POJ 3241
卡车行驶L单位距离。一开始有P单位汽油,每单位距离需耗费1单位汽油。在路途中有一些加油站,距终点Ai的加油站能加Bi汽油,要求在这之中选取最少的一些加油站,使得能够走过全程。
优先队列,每走过1个加油站,存入一个从大到小的优先队列。然后每次走到油量为0时,取出队列的头元素。若队列为空则无法到达终点。
POJ 3253
类似于合并果子。
优先队列,O(NlogN)
POJ 1182
A吃B,B吃C,C吃A,给出K条信息,求出矛盾的。
种类并查集,喜欢书上的做法。对每只动物创建3个元素i-A,i-B,i-C,其中i-x表示“i属于种类x”,并查集里的每一个组表示组内所有元素代表的情况都同时发生或不发生。
合并前,判断是否矛盾。否则,对于A和B是同一种类的信息,合并x-A和y-A,x-B和y-B,x-C和y-C。对于A吃B的信息,合并x-A和y-B,x-B和y-C,x-C和y-A。
2.6 数学
- 辗转相除法、扩展欧几里得
- 素数判断、晒垡
- 取模运算
- 快速幂
UVA10006
简单快速幂
ZOJ 3609
求解乘法逆元,ax同余1(mod m) 等价于 ax+my=1。
扩展欧几里得的应用,本题里因为求得是最小的正整数x,所以对于x=0 的特殊情况要特判一下。
本文解析了多个经典的图论与算法问题,包括最短路径、最小生成树、搜索算法及其实现技巧。通过具体题目如POJ3255、POJ3723等,介绍了Dijkstra算法、SPFA、Prim算法等关键算法的应用场景和优化方法。
83

被折叠的 条评论
为什么被折叠?



