图在程序设计中的运用是广泛的,例如地图、网络、物流、交通等。怎样将一个图数字化存储在计算机中,是在程序设计中更好的运用图的基础。下面就说说图的两种常用存储方式邻接矩阵和邻接链表,并使用Java实现。
1、邻接矩阵
图G=(V,E)是一个n顶点的图,使用邻接矩阵存储图的方法是使用一个n*n的二维数组存储,图的顶点编号和二维数组索引的映射方式有时从0开始,有时从1开始。对于0开始的映射方式,当不存在一条边时常常需要-1标记。对于从1开始的映射方式将会浪费第0列和第0行,但标记时没有边可以使用0标记。为了方便下面以1开始的映射方式为例,映射函数如下。
图G=(V,E)是一个n顶点的图,u、v是图G中的任意两个顶点。
当G是无权无向图:
A(u,v)={1 如果(u,v)属于E或(v,u)属于E
{0 其它
当G是加权无向图:
A(u,v)={weight(权值) 如果(u,v)属于E或(v,u)属于E
{0 其它
当G是无权有向图:
A(u,v)={1(权值) 如果(u,v)属于E
{0 其它
当G是加权有向图:
A(u,v)={weight(权值) 如果(u,v)属于E
{0 其它
实际应用中的图都是加权图,很少使用无权图,所以下面就是用加权无向图为例,演示图和二维数组的映射关系: