【1】邻接矩阵的存储表示
邻接矩阵是最简单、最直观的图形结构,适用于稠密图。对于一个顶点数为n的无向图,其邻接矩阵为一个n * n的方阵M,若i和j之间存在一条边,即从i到j有一条边或从j到i有一条边,则M[i][j]=1;否则M[i][j]=0。
若该无向图是一个网,即边带权,则在矩阵中相应位置记录边权值。
【2】邻接矩阵的算法描述
(1)初始化邻接矩阵为全0,若无向图为带权图,则将对角线元素初始化为∞。
(2)读取每个节点及其相邻节点的信息,并根据节点编号在邻接矩阵中标记对应位置为1或者对应位置写入边的权值。对于无向图,需要对称地在邻接矩阵中标记另一条边,即如果(i, j)是一条边,则(j, i)也是一条边。
(3)输出邻接矩阵即可。
#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100 // 最大顶点数
#define INFINITY 65535 // 初始定义为"无限大"
typedef int Vertex; // 用顶点下标表示顶点,为整型
typedef int WeightType; // 边的权值设为整型
typedef char DataType; // 顶点存储的数据类型为字符型
typedef struct GNode * PtrToGNode;
struct GNode{
int Nv; // 顶点数
int Ne; // 边数
WeightType G[MaxVertexNum][MaxVertexNum]; // 邻接矩阵
DataType Data[MaxVertexNum]; // 存顶点的数据,字符型
};
typedef PtrToGNode MGraph; // 以邻接矩阵存储的图类型
// 初始化一个有VertexNum个顶点但没有边的图
MGraph CreateGraph( int VertexNum )
{ /* 注意:这里默认顶点编号从0开始 */
Vertex V, W;
MGraph Graph;
Graph = (MGraph)malloc(sizeof(struct GNode)); /* 建立图 */
Graph->Nv = VertexNum;
Graph->Ne = 0;
/* 初始化邻接矩阵 */
for (V=0; V<Graph->Nv; V++)
for (W=0; W<Graph->Nv; W++)
Graph->G[V][W] = INFINITY;
return Graph;
}
// 插入边
void InsertEdge( MGraph Graph, Vertex V1, Vertex V2, WeightType Weight )
{
/* 插入边 <V1, V2> */
Graph->G[V1][V2] = Weight;
/* 若为无向图,还需插入边<V2, V1> */
Graph->G[V2][V1] = Weight;
}
其中, Graph->G[V1][V2]
为顶点V1和V2之间的边的权值,若为无向网,则还需要将 Graph->G[V2][V1]
设为相同值。