图的基本定义就不细讲了,可以参考“图的理论基础”,写的相当好。这里只是总结。
1:图的种类
图一般分为有向图和无向图;如果给每条边赋予一定的权值,那么这样的图叫网。
2:图的存储结构
常用的数组结构是“邻接矩阵”和“邻接表”。还有两种但是不常用:邻接多重表 和 十字链表。下面主要讲解邻接矩阵和邻接表。
-------邻接矩阵和邻接表的优缺点
①邻接表适用于稀疏图,邻接矩阵适用于稠密图
②另外,由于邻接矩阵简单明了,当图较小时,更多地采用邻接矩阵。
③如果一个图不是加权的,采用邻接矩阵还有一个好处:在储存邻接矩阵的每个元素时,可以只使用一个二进位,而不必用一个字的空间。
④需要快速判断两个结点之间是否有边相连,更多用邻接矩阵(用邻接链表需要遍历Adj[u])
(1)邻接矩阵
邻接矩阵是指用矩阵来表示图。它是采用矩阵来描述图中顶点之间的关系(及弧或边的权)。
假设图中顶点数为n,则邻接矩阵定义为:
无向图
有向图
通常采用两个数组来实现邻接矩阵:一个一维数组用来保存顶点信息,一个二维数组来用保存边的信息。
邻接矩阵的缺点就是比较耗费空间。
(2)邻接表
邻接表是图的一种链式存储表示方法。它是改进后的"邻接矩阵",它的缺点是不方便判断两个顶点之间是否有边,但是相对邻接矩阵来说更省空间。
无向图
有向图
3:邻接矩阵的表示和代码
(1)基本定义
// 邻接矩阵
typedef struct _graph
{
char vexs[MAX]; // 顶点集合
int vexnum; // 顶点数
int edgnum; // 边数
int matrix[MAX][MAX]; // 邻接矩阵
}Graph, *PGraph;
Graph是邻接矩阵对应的结构体。
vexs用于保存顶点,vexnum是顶点数,edgnum是边数;matrix则是用于保存矩阵信息的二维数组。例如,matrix[i][j]=1,则表示"顶点i(即vexs[i])"和"顶点j(即vexs[j])"是邻接点;matrix[i][j]=0,则表示它们不是邻接点。
(2)创建矩阵
参考代码:<