图和图的表示方法

    一个图(graph)G=(V,E)是由顶点(vertex)集 V 和边(edge)集 E 组成,每一条边就是一个点对(v,w),其中 v,w ∈ V。如果点对是有序的,那么图就是有向的(directed)。

    图最简单的表示方法是用一个二维数组表示,称为邻接矩阵表示法。对于每条边(u,v),我们置A[ u ][ v ] =1,否则为0;若是赋权图,那么我们可以置A[ u ][ v ]的值等于该权值,而用一个很大或很小的值标记不存在的边。这种表示方法的优点是简单,但是若图是稀疏图,即顶点很多但边很少,这种表示方法就非常浪费空间了。

    如果图是稀疏的,则更好的表示方法是使用邻接表(adjacency list)表示。对每一个顶点,我们使用一个表存放所有邻接的顶点。

    邻接表是表示图的标准方法。无向图可以类似的表示。

    在大部分时机应用中顶点都有名字而不是数字,这些名字在编译时是未知的。因为不能通过未知名字为一个数组做索引,因此必须要提供名字到数字的映射。完成这项工作的最简单的方法是使用散列表,在该散列表中对每一个顶点存储一个名字以及一个范围在 1 到 | V |之间的内部编号。这些编号在图被读入的时候指定。指定的第一个数是 1 。在每条边被读入时,检查是否它的两个顶点都已经指定了一个数,检查的方法是看是否顶点在散列表中。如果在,就使用这个内部编号,否则,将下一个可用的编号分配给该顶点,并把该顶点的名字和对应的编号插入到散列表中。

    由于我们最终输出的还是顶点的名字,因此对于每一个内部编号必须记录相应的顶点名字。如果顶点名字过长,就要花费大量的空间,因为顶点的名字要存两次。另一种方法是保留一个指向散列表内的指针数组。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值