首先,我们来看一下涉及的知识点:
图:图 G=(V,E) 由顶点集 V 和边集 E 组成。每条边对应一个点对 (v,w),其中 v,w 属于 V 。如果图中的点对是有序的,那么该图就是有向图,反之为无向图。
邻接点:若顶点 v 与 w 之间存在一条边,则认为顶点 v 与 w 邻接。
权:图中的每条边都可以对应一个数值,这种与边相关的数值称为权。
路径:在图 G 中,顶点 v1 到 vk 的路径是一个顶点序列 v1,v2,···,vk。
连通图:在无向图 G 中,若两个顶点之间存在路径,则认为这两个顶点是连通的。如果在无向图 G 中,任意两个顶点都是连通的,则称 G 是连通图。
完全图:若图中任意两个顶点之间都存在一条边,则该图为完全图。
稀疏图和稠密图:当图中边的数量比较少时,称该图为稀疏图;而当图接近完全图时,称该图为稠密图。
1、邻接矩阵
邻接矩阵就是运用二维数组,对于图中的每条边 (v,w) ,设置 A[v][w] 等于该权值;若不存在边(v,w),则 A[v][w]=0 。

基本数据结构:
typedef struct VexType { //顶点类型
int code; //顶点编号
char data; //顶点信息
}VexType;
typedef struct Graph { //邻接矩阵类型
int arcs[maxn][maxn]; //邻接矩阵
int vexnum, arcnum; //顶点数和边的个数
VexType vexs[maxn]; //顶点信息
int type; //邻接矩阵的类型(1.无向图 2.有向图)
}Graph;
创建邻接矩阵(以带权的图为例):
void Create_Graph(Graph& G) //创建
{
cout << "请输入图的类型(1.无向图 2.有向图):";
cin >> G.type;
cout << "顶点的个数:";
cin >> G.vexnum;
cout << "请输入各顶点的名称:";
for (int i = 0; i < G.vexnum; i++) {
cin >> G.vexs[i].data;
G.vexs[i].code = i; //按顺序为点编号
}
for (int i = 0; i < G.vexnum; i++) {
for (int j = 0; j < G.vexnum; j++) {
G.arcs[i][j] = 0; //邻接矩阵初始化,将所有元素的初始值设为0
}
}

本文介绍了图的基本概念,如顶点、边、权、路径和连通图等,并详细讲解了两种图的存储结构——邻接矩阵和邻接表。邻接矩阵通过二维数组表示图,适用于稠密图,空间复杂度高;邻接表使用链式存储,节省空间,适合稀疏图。文章提供了C++代码实例,展示了如何创建和打印邻接矩阵及邻接表。
最低0.47元/天 解锁文章
501

被折叠的 条评论
为什么被折叠?



