邻接矩阵法
#define MaxVertexNum 100 //顶点数目的最大值
typedef struct{
char Vex[MaxVertexNum]; //顶点表
int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表
int vexnum,arcnum; //图的当前顶点数和边数
}MGraph;
无向图
第i个顶点的度=第i行(或第i列)的非零元素个数
有向图
第i个结点的出度=第i行的非零元素个数
第i个结点的入度=第i列的非零元素个数
第i个结点的度=第i行、第i列的非零元素个数之和
邻接矩阵法求顶点的度/出度/入度的时间复杂度为O(|v|)
邻接矩阵法存储带权图(网)
#define MaxVertexNum 100 //顶点数目的最大值
#define INFINITY 最大的int值 //宏定义常量“无穷”
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型
typedef struct{
VertexType Vex[MaxVertexNum]; //顶点
EdgeType Edge[MaxVertexNum][MaxVertexNum]; //边的权
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph;
空间复杂度:O(|V|的2次方)–只和顶点数相关,和实际的边数无关
适合用于存储稠密图
无向图的邻接矩阵是对称矩阵,可以压缩存储(只存储上三角区/下三角区)
邻接矩阵法的性质
邻接表法
邻接表法(顺序+链式存储)
//边
typedef struct ArcNode{
int adjvex;
struct ArcNode *next;
}ArcNode;
//顶点
typedef struct VNode{
VertexType data; //顶点信息
ArcNode *first; //第一条边
}VNode,AdjList[MaxVertexNum];
//用邻接表存储的图
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
邻接表 | 邻接矩阵 | |
---|---|---|
空间复杂度 | 无向图O(|V|+2|E|);有向图O(|V|+|E|) | O(|V|的2次方) |
适合用于 | 存储稀疏图 | 存储稠密图 |
表示方式 | 不唯一 | 唯一 |
计算度/出度/入度 | 计算有向图的度、入度不方便,其余很方便 | 必须遍历对应行或列 |
找相邻的边 | 找有向图的入边不方便,其余很方便 | 必须遍历对应行或列 |
十字链表存储有向图
空间复杂度:O(|V|+|E|)
V:顶点个数 E:边条数
顺着绿色线路找指定顶点的所有出边
顺着橙色线路找指定顶点的所有入边
十字链表只用于存储有向图
邻接多重表存储无向图
空间复杂度:O(|V|+|E|)
删除边、删除节点等操作很方便
注意:邻接多重表只适用于存储无向图