基本的图算法

 图的表示


对于图 G =(V,E),可以用两种标准表示方法表示。一种表示法将图作为邻接链表的组合,另一种表示法则将图作为邻接矩阵来看待。两种表示方法都既可以表示无向图,也可以表示有
向图。邻接链表因为在表示稀疏图(边的条数|E|远远小于|VI"的图)时非常紧凑而成为通常的
选择。多数图算法都假定作为输人的图是以邻接链表方式进行表示的。不过,在稠密
图(|E|接近|VI’的图)的情况下,可能倾向于使用邻接矩阵表示法。另外,如果需要快速
判断任意两个结点之间是否有边相连,可能也需要使用邻接矩阵表示法。
对于图G=(V,E)来说,其邻接链表表示由一个包含|V|条链表的数组Adj 所构成,每个
结点有一条链表。对于每个结点 uEV,邻接链表 Adj[u]包含所有与结点u之间有边相连的结点
o,即Aaj[o]包含图 G中所有与w邻接的结点(也可以说,该链表里包含指向这些结点的指针)。
由于邻接链表代表的是图的边,在伪代码里,可以将数组 Adj看做是图的一个属性,就如我们
将边集合E看做是图的属性一样。

无向图的表示: 

有向图的表示:

 

对邻接链表稍加修改,即可以用来表示极重图。权重图是图中的每条边都带有一个相关的
权重的图。该权重值通常由一个 t:E→R 的权重函数给出。例如,设G=(V.E)为一个权面
图,其权重函数为 u,我们可以直接将边(u+u)C E的权重值 w(u+2)存放在结点α 的邻接链表
里。从这种意义上说,邻接链表表示法的鲁棒性很高,可以对其进行简单修改来支持许多其他倒
图变种。
邻接链表的一个潜在缺陷是无法快速判断一条边(u,o)是否是图中的一条边,唯一的办法是
在邻接链表 Adj[u]里面搜索结点 v。邻接矩阵表示则克服了这个缺陷,但付出的代价是更大的
存储空间消耗(存储空间的渐近数量级更大)
对于邻接矩阵表示来说,我们通常会将图 G中的结点编为 1,2,…,IVl,这种编号可以
是任意的。在进行此种编号之后,图 G的邻接矩阵表示由一个|V|×|V|的矩阵 A =(ai)予以
表示.无向图的邻接矩阵是一个对称矩阵。由于在无向图中,边(u,v)和边(v,u)是同一条边,无向图的邻接矩阵 A 就是自己的转置,即 A=AT。在某些应用中,可能只需要存放对角线及其以上的这部分邻接矩阵(即半个矩阵),从而将图存储空间需求减少几乎一半。
与邻接链表表示法一样,邻接矩阵也可以用来表示权重图。例如,如果 G =(V,E)为一个
权重图,其权重函数为 w,则我们直接将边(u,v)€E 的权重w(u,v)存放在邻接矩阵中的第α
行第▽列记录上。对于不存在的边,则在相应的行列记录上存放值 NIL。不过,对于许多问题来
说,用 0 或者∞来表示一条不存在的边可能更为便捷。
虽然邻接链表表示法和邻接矩阵表示法在渐近意义下至少是一样空间有效的,但邻接矩阵
表示法更为简单,因此在图规模比较小时,我们可能更倾向于使用邻接矩阵表示法。而且,对于
无向图来说,邻接矩阵还有一个优势:每个记录项只需要 1 位的空间。 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值