比树更难的数据结构...

登录以参加训练计划

图的构建方式

1、邻接矩阵

构建邻接矩阵是图论中最简单的算法。可以直接用二维数组存储,当有数需要读入时直接将 xx 点到 yy 点的路径设为 a[x][y]=za[x][y]=zzz 为权值,无需权值时设为 11)。缺点也很大,有时图较为稀疏,会浪费大量的存储空间,综合考虑,非特殊情况下不建议使用。

2、邻接表

构建邻接表是图论的核心之一,非常重要。存储方式可用 vectorvector。当有数需要读入时将 xx 点到 yy 点的路径插入到 vectorvector 数组,即为 a[x].pusha[x].push_back(y)back(y)。这种算法的最大优点是节省了大量空间,但是有个缺点便是码量大大增加。不过现在有了 autoauto 类型的变量后,这种缺点也消失了,成了现在大家用的最多的一种构建图的方法。

3、链式前向星

链式前项星也是一种构图方式,不过有一大缺点便是空间浪费严重,且需要开双倍数组。这种算法将图用看似链表的连接方式连接起来,降低了抽象性。不过现在貌似慢慢已经被淘汰了。

图的遍历

深搜

图的深搜也是图论的核心之一,非常重要。此算法十分便捷,可以通过邻接表的遍历来一层一层深入,并将走过的点标记,便可遍历完成。

2、广搜

图的广搜与深搜不同的是一个用栈遍历,一个用队列遍历。所以此算法的缺点就是码量太大,不建议使用。

图的算法

1、最小生成树

最小生成树不是树,而是图论算法的一种。最小生成树顾明思议,就是从图中生成一个最小的树,常见的算法有 primprim 等。例如 primprim,通过贪心将附近的点枚举一遍,最小权值边连接,直到成为一棵树。

2、最短路

最短路有常用短两种方法,分别是 floyddijkstrafloyd和dijkstra。一般来说, dijkstradijkstra 比较常用,但有时候 floyd floyd 也能发挥作用。

floyd

floydfloyd 的算法依靠 dpdpfloydfloyd 是极为少见的需要依靠邻接矩阵的算法,核心代码如下:

a[i][j]=min(a[i][j],a[i][k]+a[k][j]);

时间复杂度为 O(n3)O(n^3)

dijkstra

dijkstradijkstra 的算法依靠贪心。与floyd算法不同,dijkstra能更快获取最短路径,时间复杂度高达 O(nlogn)O(nlogn)。核心是通过枚举点做优先队列获取最短路(类似广搜)。

章节 1. 最初的最初 - A+B Problem

开放

题目 尝试 AC 难度
P1000   A+B Problem 85 38 4
 
参加人数
3
创建人