数据结构——图(2)

本文详细介绍了图的三种存储结构:邻接矩阵(适用于无向图和有向图,尤其适合边较多的情况)、邻接链表(节省空间,适用于边较少的图)以及十字链表(结合邻接表和逆邻接表,方便获取顶点的入度和出度)。邻接矩阵通过二维数组表示图中顶点的关系,邻接链表由一维数组和单链表结合,十字链表则同时考虑了出度和入度。
摘要由CSDN通过智能技术生成

数据结构——图

(二)图的存储结构

存储结构

1.邻接矩阵表示法:

    利用一个矩阵来表示图中顶点之间的关系,反映的是顶点间的相邻关系。一个n行n列的矩阵表示由n个顶点的图,如果(i,j)或者<i,j>属于边集合,则矩阵中第i行j列的值为1,否则为0。图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。

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

例如:的邻接矩阵为

看一个实例,下图左就是一个无向图:

      从邻接矩阵的定义可以推断,无向图的邻接矩阵是对称的;有向图的邻接矩阵是则不具备该性质。

      借助于邻接矩阵,可判定任意两点之间是否有边(或者弧)相连,并且容易求得各个顶点的度。对于无向图,顶点vi的度是邻接矩阵第i行(或列)的值不为0的元素数目(或元素的和);对于有向图,第i行元素之和为顶点vi的出度OD(vi),第j列的元素之和为顶点vj的入度ID(vj)。

       从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵就是n阶矩阵的元满足aij = aji。即从矩阵的左上角到右下角的主对角线为轴,右上角的元和左下角相对应的元全都是相等的。
    从这个矩阵中,很容易知道图中的信息。
    (1)要判断任意两顶点是否有边无边就很容易了;
    (2)要知道某个顶点的度,其实就是这个顶点vi在邻接矩阵中第i行或(第i列)的元素之和;
    (3)求顶点vi的所有邻接点就是将矩阵中第i行元素扫描一遍,arc[i][j]为1就是邻接点;
    而有向图讲究入度和出度,顶点vi的入度为1,正好是第i列各数之和。顶点vi的出度为2,即第i行的各数之和。
    若图G是网图,有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:

     这里的wij表示(vi,vj)上的权值。无穷大表示一个计算机允许的、大于所有边上权值的值,也就是一个不可能的极限值。下面左图就是一个有向网图,右图就是它的邻接矩阵。

代码表示:

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
typedef char VertexType;                //顶点类型应由用户定义
typedef int EdgeType;                   //边上的权值类型应由用户定义
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙星尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值