图--邻接矩阵基础知识

  这周我们来学习图的有关知识,在正式开始了解邻接矩阵之前,我们先对图做一个基本了解。

  什么是图呢?要了解图需要知道些什么呢?

  图是一种比线性表和树更复杂的数据结构。在图结构中,结点之间的关系可以是任意的,图中任意两个数据元素都可能相关。线性表里,每个元素只有一个直接前驱和一个直接后继;在数据的结构中,数据元素之间有着明显的层次关系,并且每一层中的数据元素只能和其上一层或者下一层的元素相关联。

  那么了解图我们需要知道哪些内容呢?

  图的两个基本元素是顶点和边,边可以分为有向的也可以是无向的。如果边是无向的则称之为无向图,如果边是有向的,则称之为有向图。如果是有向图则用尖括号表示G=<v1,v2>(表示从v1顶点到v2顶点,是有方向的),如果是无向图则用圆括号表示,G=(v1,v2)(表示从v1到v2顶点也可以表示从v2到v1,没有方向)。

  在了解完这两个基础知识(第一个基础知识是图的数据结构关系是多对多,任意两个元素之间都可能产生联系。第二个基础知识是图的两个基本元素是顶点和边,根据边又可以分为有向图和无向图),我们就已经可以开始进行图的学习了!

  对于有n个顶点的无向图G,若G是连通图(任意两个元素之间都能够找到一个路径),那么最少有n-1条边,若G是非连通图,那么最多可能有C2 (n-2)条边。

  怎么来理解这句话呢?如果它是连通图,那么任意两个元素之间至少有一条路径,当然也可以有多条路径,多条路径就意味着边变多。要边最少又每个元素之间有路径,而它是无向图,就么就是说,从这条路径过去了还是可以回来的,那么就是形成一个线性表就可以了。

  如果要它变成一个非连通图,那么至少有一个结点和它不相干,把这个结点拿出来,其他的结点任意组合,这个时候形成的边就是最多的边。这么说有点抽象,看图!

  对于有n个顶点的有向图G,若G是强连通图(强连通图是有向图特有的性质),则最少有n条边(形成回路)。

  怎么来理解这句话呢?如果它是强连通图,那么任意两个元素之间至少有一条路径,当然也可以有多条路径,多条路径就意味着边变多。而它又是有向图,每条路径是有方向的,不可逆的。通俗的讲就是从这条路过去了但是回不来。要满足边最少并且每个元素之间有路径,那么就是形成了一个回路

  我们可以通过中文和画图来很方便的理解图的概念,那么对于计算机而言,它是怎么来理解图的呢?

  今天我们只探讨一种方法--邻接矩阵法

  所谓的邻接矩阵,是指用两个数组存放图的两个基本要素,用一个一维数组存储顶点的信息,用一个二维数组存放边的信息(就是各顶点之间的邻接关系)

在这里举两个例子:

例1:无向图的举例

分析:

有几个顶点就是几乘几的矩阵;从每行开始填或者从每列开始填,如果从v1开始填与v1相连的有三条边--v2,v5,v7,那么就在这三条边的位置填上1,在其余位置填上0.v2,v3以及后面的顶点也是同样如此。

画出图之后,发现对角线元素的值全为0,而且矩阵元素关于对角线对称。无向图的度就等于与之相连的边。

例2:有向图举例

有向图的邻接矩阵并不对称,横向看是出度,竖向看是入度。度数之和等于出度之和加上入度之和。

  既然我们知道如何用自然语言描述邻接矩阵,那么我们如何再使用机器语言进行描述呢?见如下所示代码:

#define MaxVertexNum 100  //顶点数目的最大值
typedef char VertexType;  //顶点的数据类型
typedef int EdgeType;     //带权图中边上权值的数据类型
typedef struct{
      VertexType Vex[MaxVertexNum];   //顶点表
      EdgeType Edge[MaxVertexNum][MaxVertexNum];  //邻接矩阵,边表
      int vexnum,arcnum;        //图的当前顶点数和弧数
}MGraph;

以上就是今天的全部内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值