图 - 存储结构之邻接矩阵

图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。

设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:

我们来看一个实例,图7-4-2的左图就是一个无向图。

我们再来看一个有向图样例,如图7-4-3所示的左图。

图的术语中,我们提到了网的概念,也就是每条边上都带有权的图叫做网。那些这些权值就需要保存下来。

设图G是网图,有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:

如图7-4-4左图就是一个有向网图。

下面示例无向网图的创建代码:(改编自《大话数据结构》)

C++ Code


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

 
#include<iostream>

using namespace std;

#define MAXVEX 100/* 最大顶点数,应由用户定义 */

#define INFINITY  65535 /* 表示权值的无穷*/

typedef int EdgeType;/* 边上的权值类型应由用户定义 */

typedef char VertexType;/* 顶点类型应由用户定义  */

typedef struct

{

VertexType vexs[MAXVEX];/* 顶点表 */

EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */

int numNodes, numEdges;/* 图中当前的顶点数和边数  */

} MGraph;

/* 建立无向网图的邻接矩阵表示 */

void CreateMGraph(MGraph *Gp)

{

int i, j, k, w;

cout << "请输入顶点数和边数(空格分隔):" << endl;

cin >> Gp->numNodes >> Gp->numEdges;

cout << "请输入顶点信息(空格分隔):" << endl;

for (i = 0; i < Gp->numNodes; i++)

cin >> Gp->vexs[i];

for (i = 0; i < Gp->numNodes; i++)

{

for (j = 0; j < Gp->numNodes; j++)

{

if (i == j)

Gp->arc[i][j] = 0;/* 顶点没有到自己的边*/

else

Gp->arc[i][j] = INFINITY;/* 邻接矩阵初始化 */

}

}

for (k = 0; k < Gp->numEdges; k++)

{

cout << "请输入边(vi, vj)的上标i,下标j和权值w(空格分隔):" << endl;

cin >> i >> j >> w;

Gp->arc[i][j] = w;

Gp->arc[j][i] = Gp->arc[i][j];/* 因为是无向图,矩阵对称 */

}

}

int main(void)

{

MGraph MG;

CreateMGraph(&MG);

return 0;

}

原文地址:https://www.cnblogs.com/alantu2018/p/8471699.html

时间: 2024-08-28 21:34:11

图 - 存储结构之邻接矩阵的相关文章

图的存储结构(邻接矩阵)

图的存储结构(邻接矩阵) 让编程改变世界 Change the world by program 图的存储结构 图的存储结构相比较线性表与树来说就复杂很多. 我们回顾下,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放.树结构是一对多的关系,所以我们要将数组和链表的特性结合在一起才能更好的存放. 那么我们的图,是多对多的情况,另外图上的任何一个顶点都可以被看作是第一个顶点,任一顶点的邻接点之间也不存在次序关系. 我们仔细观察以下几张图,然后深刻领悟一下: 因为任意两个顶点之间都可能

数据结构之图(存储结构、遍历)

新学期开始了,开始专心于技术上了,上学期的寒假总是那么短暂,飘飘乎就这样逝去,今天补补上学期还没学完的数据结构---图,希望能和大家一起探讨,共同进步~ 定义: 图是由顶点集合及顶点间的关系集合组成的一种数据结构. 图的存储结构: 1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图.一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图. 从上面可以看出,无向图的边数组是一

图 - 存储结构之邻接表

对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的.因此我们考虑另外一种存储结构方式:邻接表(Adjacency List),即数组与链表相结合的存储方法. 邻接表的处理方法是这样的. 1.图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息. 2.图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,

图的存储结构:邻接矩阵(邻接表)&amp;链式前向星

[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组graph[ ][ ]来记录图中点a与点b之间是否连通,初始化为0(或者-1之类的看情况):如果图中有可忽略的重边(如 只需重边中的最小边或最大边),则保存需要的那条边的边权,但如果有无法忽略的重边,就一定不要用邻接矩阵. int graph[MAXN][MAXN]; void graphInit() { me

图的理解:存储结构与邻接矩阵

存储结构 要存储一个图,我们知道图既有结点,又有边,对于有权图来说,每条边上还带有权值.常用的图的存储结构主要有以下二种: 邻接矩阵 邻接表 邻接矩阵 我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法. 我们假设A是这个二维数组,那么A中的一个元素aij不仅体现出了结点vi和结点vj的关系,而且aij的值正可以表示权值的大小. 以下是一个无向图的邻接矩阵表示示例: 从上图我们可

存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有结点,又有边,对于有权图来说,每条边上还带有权值.常用的图的存储结构主要有以下二种: 邻接矩阵 邻接表 邻接矩阵 我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法. 我们假设A是这个二维数组

数据结构之图(一)图的存储结构

图的存储结构相对于线性表和树来说更为复杂,因为图中的顶点具有相对概念,没有固定的位置.那我们怎么存储图的数据结构呢?我们知道,图是由(V, E)来表示的,对于无向图来说,其中 V = (v0, v1, ... , vn),E = { (vi,vj) (0 <=  i, j <=  n且i 不等于j)},对于有向图,E = { < vi,vj > (0 <=  i, j <=  n且i 不等于j)}.V是顶点的集合,E是边的集合.所以我们只要把顶点和边的集合储存起来,那么

图的定义和存储结构

学习目的及应用:导航 .GPS.网络规划.路径规划 交通流可以用一个图来模型化,每一条街道交叉口表示一个顶点,而每一条街道就是一条边.边的值可能是代表限制速度,或者是容量(车道的数目)等等.此时我们可能需要找出一条最短路,或用该信息找出最可能产生交通瓶颈的位置, 图的定义: 是由顶点的有穷非空集合和顶点之间边的集合组成一种数据结构 表示方法: graph = ( V,E ) V = { x | x 属于 某个数据对象} 是顶点的有穷非空集合 E = { (x, y) | (x, y) 属于 V

图总结之存储结构代码详解

一.图的存储结构 1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图.一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图. 从上面可以看出,无向图的边数组是一个对称矩阵.所谓对称矩阵就是n阶矩阵的元满足aij = aji.即从矩阵的左上角到右下角的主对角线为轴,右上角的元和左下角相对应的元全都是相等的. 从这个矩阵中,很容易知道图中的信息. (1)要判断任意两顶点是否有