一、邻接矩阵
构造一个二维矩阵M = {mi, j}。
如果图是无权图,那么仅需要表示边的邻接关系。这时每个元素mi, j的取值只能是0或1:
如果图是有权图,那么还需要表示边权。权值有时候会取0,所以表示方法改成:
当用邻接矩阵表示无向图时,需要同时添加有向边<i, j>和<j, i>,得到的邻接矩阵关于主对角线对称。
二、邻接表
每个节点至少包含当前节点的编号和下一个节点的指针。每个节点的指针都指向邻接节点。邻接节点的存储是无序的,要查找一个节点的某个邻接节点,就要从该节点开始一直沿下一个节点的指针访问到目标节点或下一个节点的指针为空为止(此时代表未找到该邻接节点)。
也可以用向量数组来方便地保存邻接表。
对有权边,在下一个节点添加一个元素,用于保存权。对有的题目,可以只用邻接表保存邻接关系,而用额外的数组去存储每条边的权。
三、链式前向星
这是一种比较新的图的表示方法。前向星是一种特殊的边数组。我们把边数组{<u, v>n}中的每一条边先后按照起点u、终点v排序,并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,就完成了前向星的构造。
但是这个过程需要用到快排,使得时间复杂度为O(n log n)