一、邻接矩阵
若图为不带权值的图:
则边值为0或者1,可以让边表的数据类型为bool类型的数组
若图为带权值的图:
则边值为一个数字或者∞。∞代表这两点之间没有边;数字则代表若这两个点右边时边的权值。
总之,在邻接矩阵中若某个边的值为0或者∞则代表:在邻接矩阵中与这个位置相关的两个定点之间没有边。
空间复杂度
O(n^2)
#define MaxVertexNum 100//定点数目的最大值
#define INT_MAX//INT类型数据的最大值,可用其表示∞
typedef struct{
char Vex[MaxVertexNum];//定点表,(最长不能超过MaxVertexNum)
int Edge[MaxVertexNum][MaxVertexNum];//二维数组,表示邻接矩阵的编表
int vexnum, arcnum;//图当前定点数和边数
}MGraph;
二、邻接表
空间复杂度
无向图:
O(|V| + 1|E|):其中|V|为图中顶点的个个数。|E|为图中边的个数。
边个数乘2的原因是:
比如<a,b>是一条与a,b定点相关的弧。
那么这表弧结点,会在存储与a相关的弧时存一次,也会在存储与b相关的弧时再存一次。
故同一条弧被存储了两次,所以弧的总数要×2。
有向图
空间复杂度:O(|V| + |E|)
注意这里边数与无向图边数的区别。
弧<a,b>就代表丛顶点a指向顶点b的弧,所以只会在存储以a为弧尾的边时存这条弧。
不会在存储与b有关的弧时再存一遍了。
//定点的结构
typedef struct VNode{
VertexType data;//定点信息
ArcNode *first;//第一条边/弧
}VNode, AdjList[MaxVertexNum];
//AdjList[MaxVertexNum]代表以上面定义的结构为元素数据类型的数组
//即这个数组中,每个元素都是VNode这种结构的
//边/弧的结构
typedef struct ArcNode{
int adjvex;//边/弧指向哪个结点
struct ArcNode *next;//指向下一条弧的指针
//InfoType info;//边权值,若为带权图,则有这一项
}ArcNode;
//邻接表整体的结构
typedef struct{
AdjList vertices;//邻接表,本质数据类型为数组,数组中的每个元素都是VNode结构
int vexnum, arcnum;//顶点个数和弧个数
}ALGraph;//ALGraph是以邻接表存储的图类型