本节内容来源于Network Flows Theory, Algorithms, and Applications2.3节,主要介绍网络的表示方法。
网络(Networks)的表示归根结底主要存储两类信息:
1)网络拓扑结构(network topology),主要是节点和弧的结构;
2)数据信息(data),如成本(cost)、容量(capacity)、供应(supply)、需求(demand)等。
本文下面的表示方式均基于图1所示网络。
图1 网络图
1. 节点-弧关联矩阵(node-arc incidence matrix)
行代表节点,列代表弧;与列弧有关的起点标为1,终点标为-1,无关则标为0。
图2 节点-弧关联矩阵
2. 节点-节点关联矩阵(node-node adjacency matrix)
行、列均代表节点。如果节点之间有连接,则为1;否则为0。此种表示方法只有在网络密集时表示效率才高。
图3 节点-节点关联矩阵
3. 邻接表(adjacency lists)
左侧i代表节点,右侧是链接表,其中j、cij、uij分别代表连接的节点、成本、弧容量。邻接表即为节点邻接表(the node adjacency list)的变形。
图4 邻接表
4. 前向星形图(forward star representations)
前向星形图也是节点邻接表(the node adjacency list)的一种变形。首先将弧按从节点1、节点2、节点3、....出发的顺序标号,从同一节点出发的弧按任意顺序标号。例如图1所示网络中,从节点1出发的有(1,2)、(1,3),从节点2 出发的有(2,4)。则可将弧排序为(1,2)、(1,3)、(2,4)、(3,2)、(4,3)、(4,5)、(5,3)、(5,4)。前向星形图分为两部分,左半部分point(i)表示从节点1-5出发的最小弧标号。为保持一致性,point(1)=1,point(6)即为总弧数+1;右半部分表示8条弧分别对应的头(tail)、尾(head)、成本(cost)、容量(capacity)。
图5 前向星形图
5. 后向星形图
首先将弧按进入节点1、节点2、节点3、....的顺序标号,从同一节点出发的弧按任意顺序标号。例如图1所示网络中,无进入节点1的弧,进入节点2的弧有(3,2)、(1,2)。则可将弧排序为(3,2)、(1,2)、(1,3)、(4,3)、(5,3)、(5,4)、(2,4)、(4,5)。后向星形图分为两部分,右半部分rpoint(i)表示进入节点1-5的最小弧标号。为保持一致性,point(1)=1,point(6)即为总弧数+1;左半部分表示8条弧分别对应的头(tail)、尾(head)、成本(cost)、容量(capacity)。
图6 后向星形图
6. 前后向星形图的组合表示
为节省存储空间,可将前向星形图和后向星形图的冗余部分去掉,组合成图7所示。point、tail、head、cost、capacity均按前向星形图表示,rpoint按后向星形图表示,trace作为两部分的桥梁,表明了后向星形图的弧排序与前向星形图弧排序的对应关系。例如,后向星形图的弧1-8对应前向星形图分别是4、1、2、5、7、8、3、6。
图7 前后向星形图的组合表示
7. 星形图与邻接表的比较:星形图相比邻接表的表示空间效率高,占用存储空间少;邻接表涉及链表操作,更易于在C语言等实现,且增删弧(或节点)所需时间是常数。