图(Graph)是由顶点的有穷非空集合和顶点之间的边的集合组成,通常表示为G(V,E),其中,G指的是一个图,V指的是G中顶点的集合,E指的是G中边的集合。
一、图的定义
包含边表和顶点表。一维数组反映顶点信息,二维数组反映顶点之间的关系,即边或弧的信息。
const int MaxVertexNum = 100;//最大顶点数
const int INFINITY = 65535;//表示无穷,即两个点顶点之间不存在边
typedef char VertexType;//顶点类型
typedef int EdgeType;//边上权值类型
typedef struct {
VertexType Vretex[MaxVertexNum];//顶点表
EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
int VertexNum, EdgeNum; //顶点数,边数
} MGraph;//M指Matrix,意为矩阵
二、图的邻接矩阵存储
用两个数组来表示一个图,一维数组Vertex存储顶点信息,二维数组Edge存储边的信息。Edge数组中具体值表示顶点Vi到顶点Vj之间的边的权值,若为无穷,则两顶点之间无边,也可认为不可达。有无向图的特性可知,其邻接矩阵为对称矩阵。
1、创建无向图,用邻接矩阵存储
MGraph CreateUndirectedMGraph(MGraph &G) { //创建无向图
cin >> G.VertexNum >> G.VertexNum;//输入顶点和边的个数
for (int i = 0; i < G.VertexNum; ++i) {//读入顶点,建立顶点表
cin >> G.Vretex[i];
}
for (int i = 0; i < G.VertexNum; ++i) {//初始化邻接矩阵,即各顶点之间初始不可达
for (int j = 0; j < G.VertexNum; ++j) {
G.Edge[i][j] = INFINITY;//距离设为无穷
}
}
for (int k = 0; k < G.EdgeNum; ++k) { //读入各边
int i, j;//表示与边(Vi,Vj)相连的两个顶点下标i,j
EdgeType weight;//边上权重
cin >> i >> j >> weight;
G.Edge[i][j] = weight;//保存权值
G.Edge[j][i] = G.Edge[i][j];//无向图的邻接矩阵对称
}
return G;
}
2、创建有向图,用邻接矩阵存储
MGraph CreateDirectedMGraph(MGraph &G) { //创建有向图
cin >> G.VertexNum >> G.VertexNum;//输入顶点和有向边的个数
for (int i = 0; i < G.VertexNum; ++i) {//读入顶点,建立顶点表
cin >> G.Vretex[i];
}
for (int i = 0; i < G.VertexNum; ++i) {//初始化邻接矩阵,即各顶点之间初始不可达
for (int j = 0; j < G.VertexNum; ++j) {
if (i == j) G.Edge[i][j] = 0;//顶点到自身权值设为0
else G.Edge[i][j] = INFINITY;//距离设为无穷
}
}
for (int k = 0; k < G.EdgeNum; ++k) { //读入各有向边
int i, j;//表示与边<Vi,Vj>相连的两个顶点下标i,j,由Vi->Vj
EdgeType weight;//边上权重
cin >> i >> j >> weight;
G.Edge[i][j] = weight;//保存权值
}
return G;
}