本文适用于对图论代码实现不了解的初学者。
图的概念
所谓图,即一些顶点和边的集合。其中点的位置、边的形状是无所谓的,重点研究的是点和边的关系。
在图中,一条边仅能连接2个点。边分为有向边(单向连接)和无向边(双向连接)
有向图:边为有向边的图。
无向图:边为无向边的图。
树:边数=顶点数-1的无向连通图。
图的建立
图有两种表示方法:邻接矩阵和邻接表。
邻接矩阵指:对于一个n个顶点的图,建立一个n*n的二维矩阵g[n][n],其中g[i][j]可以按照自己的选择定义:对于无权图,1代表i到j有一条有向边,0代表i到j没有边。对于带权图,a[i][j]=x代表i到j有一条权值为x的边。
如果是无向图,可以让a[i][j]=a[j][i]=x代表i和j连接了一条权值为x的边。
邻接矩阵存在一些缺陷:第一是如果是稀疏矩阵(边数远小于点数的平方),会存在大量的0,浪费了大量的空间,如果n较大时,二维矩阵就无法存储。第二是如果有重边的话(如i到j有两条不同的有向边相连),邻接矩阵将无法存储。
这里介绍一下邻接表。所谓邻接表,指对于n个顶点,先设置n条空链表,假设引进了i到j的一条边,那么在第i个链表上新增一个节点来描述这条边的信息。由于链表占据的空间是可变的,因此这种存图的方法方便存储稀疏矩阵(尤其是树的建立)。