图最常用的存储结构主要是邻接矩阵和邻接表。当顶点数太大时,用二维数组表示的邻接矩阵可能超内存(MLE),而用邻接表的编码工作量较大,此时,使用vector数组或链式前向星模拟邻接表是不错的选择。因vector数组容易理解,这里仅介绍链式前向星存储图。
设有向图的顶点数n=5,边数m=10,输入的边用三个整数from, to, w,分别表示一条边的起点(弧尾顶点)、终点(弧头顶点),边上的权值。输入的10条边如下:
3 4 7
4 1 3
1 3 5
2 4 8
3 2 5
2 3 6
4 2 5
1 2 9
2 1 4
3 5 7
因链式前向星存储图实际上是静态链表,即用数组模拟链表,这里先回顾邻接表存储图的知识,以便读者能更好地理解链式前向星。若读者清楚知道这部分内容,则可跳过。
邻接表包含表头结点表(一个数组,设为head)和边表(若干链表)两部分,边表的每个链表结点包含邻接点to,权值weight,指向下一条边的指针域next。每条边采用头插法插入对应链表中,则用上述的数据构建的邻接表如下(表头结点表用整型指针数组即可,1~5表示下标):
相应的实现代码如下&#