邻接矩阵是一种最普通的存储图的结构,既可存储无向图(网),又可以存储有向图(网)。
邻接矩阵一般用一个一维数组存储图的顶点信息;用一个二维数组(矩阵)存储顶点之间是否邻接。
邻接矩阵存储不加权图时,直接用0、1来判断俩顶点之间是否邻接。存储加权图时,则用无穷表示不邻接,用弧上权值表示邻接。
#define MAX_VERTEX_NUM 10 // 图最大顶点数
typedef enum { DG, DN, UDG, UDN }GraphKind; // 图类型(有向图、有向网、无向图、无向网)
typedef int VerType; // 顶点类型
typedef string InfoType; // 弧上信息类型
typedef int VRType; // 顶点之间的关系
// 弧
typedef struct Arc {
Arc() :is_adj(0), info(NULL) {}
Arc(VRType adj) :is_adj(adj), info(NULL) {}
VRType is_adj; // 该弧俩顶点是否联通
InfoType* info; // 弧信息
}Arc, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
// 图
typedef struct Graph{
Graph() :ver_num(0), arc_num(0) {}
VerType Vertex[MAX_VERTEX_NUM]; // 顶点数组
AdjMatrix AdjM; // 邻接矩阵
int ver_num; // 顶点数
int arc_num; // 弧数
GraphKind Kind; // 图类型
}Graph;
获取顶点在顶点数组位置
// 获取顶点位置
int LocateVertex(Graph &graph, VerType ver) {
for (int i = 0; i < graph.ver_num; ++i) {
if (ver == graph.Vertex[i]) return i;
}
return -1;
}
无向图:
// 创建无向图
void CreatUDG(Graph &graph) {
graph.Kind = UDG;
cout << "输入顶点数、边数>> " << endl;
cin >> graph.ver_num >> graph.arc_num;
cout << "输入顶点信息>> " << endl;
for (int i = 0; i < graph.ver_num; ++i) {
cin >> graph.Vertex[i];
}
VerType v1, v2;
bool Is_Info = false;
for (int i = 0; i < graph.arc_num; ++i) {
cout << "输入联通的顶点> " << endl;
cin >> v1 >> v2;
int index1 = LocateVertex(graph, v1);
int index2 = LocateVertex(graph, v2);
if (index1 < 0 || index2 < 0) {
cout << "联通顶点错误" << endl;
--i;
continue;
}
cout << "弧上是否存储信息>>" << endl;
cout << " 1、是 0、否" << endl;
cin >> Is_Info;
graph.AdjM[index1][index2].is_adj = 1;
graph.AdjM[index2][index1].is_adj = 1;
if (Is_Info) {
cout << "输入弧上信息" << endl;
InfoType INFO;
cin >> INFO;
graph.AdjM[index1][index2].info = new InfoType(INFO);
graph.AdjM[index2][index1].info = new InfoType(INFO);
}
}
}
有向图:
创建操作同无向图基本一致,无向图需同时设置俩条弧,而有向图只需设置一条有向弧。
无向网:
在无向图的基础上,将顶点不邻接设为无穷,邻接的顶点用弧上权值设置。(0不在代表不邻接,仅为弧上权值)
有向网:
同无向网原理。