图的存储

  1. 直接存,起点,终点,边权。一些需要对边进行操作的题目会用到这个方法,比如求解最小生成树的Kruskal。这个方法的缺点是,确定起点,不能很快的得到所有相邻的边。
  2. 把边按起点排序存,并且记录以每个点为起点的第一条边和最后一条边。在第一个方法基础上,可以很容易的想到,把所有边按起点排序,这样确定起点,相邻的边是连续的一个区间。按起点排序时,可以使用计数排序。
  3. 链表存。(值得注意的是,这样存后加入的边,会先被访问。)
  4. vector,变长数组存。如果数据范围不大,或者评测打开O2,vector是非常方便的数据结构。
  5. 邻接矩阵。对于一些算法比如Floyd,需要使用邻接矩阵存边。

3 种方法
链表
vector
邻接矩阵

How to store the edges
Some vertices may have many edges O(n) edges.
Some vertices many have 1~2 edges.

We can not
int a[n][n];
O(n^2)

  1. 图的存储