文章目录
1.邻接矩阵
用两个数组分别存储:数据元素(顶点
)的信息和数据元素之间的关系(边或弧
)的信息。
其形式描述如下:
// ----- 图的数组(邻接矩阵)存储表示 ----- //
// 常量定义
# define INFINITY -1 // 最大权重,表示不邻接关系
# define MAX_VERTEX_NUM 10 // 最大顶点个数
typedef int VRType; // 顶点间的关系类型,如0/1表示邻接否
typedef char InfoType; // 弧段的信息类型
typedef char VertexType; // 顶点信息类型
typedef enum {
DG, DN, UDG, UDN } GraphKind; // 有向图、有向网、 无向图、无向网
// 图的邻接矩阵存储结构定义
typedef struct ArcCell {
// 弧/边的基本结构
VRType adj; // VRType是顶点的关系类型,对无权图用1或0表示是否相邻,对带权图(网)用权值
InfoType *info; // 该弧段相关信息的指针
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
// 图的基本结构
VertexType vexs[MAX_VERTEX_NUM]; // 顶点向量
AdjMatrix arcs; // 邻接矩阵
int vexnum, arcnum; // 当前节点、边二点数目
GraphKind kind; // 图的种类
}MGraph;
2.图的创建
无向网(带权值的无向图)
//构造无向网UDN
void createUDN(MGraph& G) {
int incInfo; //表示有无弧上信息,0表示弧不含任何信息
cin >> G.vexnum >> G.arcnum >> incInfo;
int i, j;
for (i = 0; i < G.vexnum; i++) cin >> G.vexs[i]; // 输入顶点的信息
for (i = 0; i < G.vexnum; i++) {
for (j = 0; j < G.vexnum; j++) G.arcs[i][j] = {
INFINITY,NULL }; // 初始化邻接矩阵
}
for (i = 0; i < G.arcnum; i++) {
// 输入弧v1-v2的信息
VertexType v1, v2;
int w;
cin >> v1 >> v2 >> w;
int l1 = LocateVex(G, v1);
int l2 = LocateVex(G, v2);
G.arcs[l1][l2].adj = w; // 输入弧上权重信息
if (incInfo) cin >> *G.arcs[l1][l2].info; // 若有弧上信息,则输入
G.arcs[l2][l1] = G.arcs[l1][l2];
}
}
无向图(不带权值的无向图)
//构建无向图UDG
void createUDG(MGraph& G)