图和它的邻接矩阵示例
- G1 是
有向图,G2 是无向图,无向图的邻接矩阵是对称的。


- 可以借助
邻接矩阵判断两个顶点之间是否有弧或者边相连。
有向图中包括顶点和弧
无向图中包括顶点和边
对于无向图:顶点 vi 的度是第 i 行的元素和 或者 第 i 列的元素和
对于有向图:顶点 vi 的出度是第 i 行的元素和,入度是第 j 列的元素和
有向网和它的邻接矩阵示例
- 定义
下图 wi,j 为 顶点 vi 和 vj 构成的弧的权值。

- 示例

数组表示法相关 存储结构
- 用两个数组分别存储
数据元素(顶点)的信息 和 数据元素之间的关系(边或弧)的信息。
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20
typedef enum
{
DG,
DN,
UDG,
UDN
} GraphKind;
typedef struct ArcCell
{
VRType adj;
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;
构造图G算法(基于结构 MGraph)
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum, arcnum;
GraphKind kind;
} MGraph;
Status CreateGraph(MGraph &G)
{
scanf(&G.kind);
switch(G.kind)
{
case DG: return CreateDG(G);
case DN: return CreateDN(G);
case UDG: return CreateUDG(G);
case UDN: return CreateUDN(G);
default: return ERROR;
}
}
Status CreateUDN(MGraph &G)
{
scanf(&G.vexnum, &G.arcnum, &IncInfo);
for(i=0; i<G.vexnum; ++i)
{
scanf(&G.vexs[i]);
}
for(i=0; i<G.vexnum; ++i)
{
for(j=0; j<G.vexnum; ++j)
{
G.arcs[i][j] = {INFINITY, NULL};
}
}
for(k=0; k<G.arcnum; ++k)
{
scanf(&v1, &v2, &w);
i = LocateVex(G, v1);
j = LocateVex(G, v2);
G.arcs[i][j].adj = w;
G.arcs[j][i].adj = G.arcs[i][j].adj;
if(IncInfo)
{
Input(*G.arcs[i][j].info);
}
}
return OK;
}
- 时间复杂度
利用上述算法构造一个具有 n 个顶点和 e 条边的无向网 G 的时间复杂度是 O( n2 + e * n ),
对邻接矩阵的初始化耗费了 O( n2 ) 。