邻接矩阵法

#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|)
 删除边、删除节点等操作很方便
 注意:邻接多重表只适用于存储无向图
 



















