图论算法

图的基础

一个图(graph)G = (V,E)由顶点(vertex)集V和边(edge)集E组成。每一条边就是一个点对(v,w),v,w∈V。有时也把边叫做弧(arc)。如果点对是有序的,那么图叫做有向的(directed),有向的图叫做有向图(digraph)。当且仅当(v,w)∈E时,称顶点v和w邻接(adjacent)

图中的一条路径(path)是一个顶点序列w1,w2,w3,...,wN,其中(w i,w i+1)∈E,1<=i<N。这样一条路径的长(length)是该路径上的边数,它等于N-1。从一个顶点到它自身可以看成是一条路径;如果路径不包含边,那么路径的长为0

如果图含有一条从一个顶点到它自身的边(v,v),那么路径v,v有时也叫作一个环(loop)

简单路径是指一条路径上所有的顶点都是互异的,但第一个顶点和最后一个顶点可能相同

有向图的圈(cycle)是满足w1 = wN且长至少为1的一条路径;如果该路径是简单路径,那么这个圈就是简单圈。如果一个有向图没有圈,则称其为无圈的(acyclic),一个有向无圈图简称为DAG

如果在一个无向图中从每一个顶点到其他所有顶点都存在一条路径,则称无向图联通的(connected)。具有这样性质的有向图强联通的(strongly connected)。如果一个有向图不是强联通的,那么该有向图称为是弱连通的(weakly connected)。完全图(complete graph)是其每一对顶点间都存在一条边的图



图的表示

表示图一种简单的方法是使用一个二维数组,称为邻接矩阵(adjacency matrix)表示法。对于每条边(u,v),我们置A[u][v] = 1;否则为0。如果边有权,可以置A[u][v]等于该权,并使用一个很大或很小的权表示边不存在。这种表示方法的优点是简单,但空间需求为Θ(|V|^2),如果图的边不是很多,那么表示的代价就太大了。如果图是稠密的(dense):|E| = Θ(|V|^2),则邻接矩阵是合适的表示方法

如果图是稀疏的(sparse),则更好的表示方法是邻接表(adjacency list)。对每个顶点,使用一个链表存放所有的邻接顶点,此时的空间需求为O(|E| + |V|)。邻接表是表示图的标准方法。无向图可以类似地表示,不过每条边出现在两个表中,因此空间的使用基本上是双倍的

在大部分应用中,顶点都使用名字而非数字,而这些名字在编译时是未知的。由于我们不能通过未知名字为一个数组做索引,因此我们必须提供名字到数字的映射,完成这项工作最容易的方法是使用散列表



拓扑排序

拓扑排序是对有向无圈图的顶点的一种排序,它使得如果存在一条从vi到vj的路径,那么在排序中vj出现在vi后面。显然,如果图含有圈,那么拓扑排序是不可能的

一个简单的拓扑排序算法是先找出任意一个没有入边的顶点,然后显示出该顶点,并将它和它的边一起从图中删除。然后,我们对图的其余部分应用同样的方法处理。我们把顶点v的入度(indegree)定义为边(u,v)的条数

比较高效的算法是,首先对每一个顶点计算它的入度;然后,将所有入度为0的顶点放入一个初始为空的队列中。当队列非空时,删除一个顶点v(dequeue),并将与v邻接的所有顶点的入度减1。只要一个顶点的入度降为0,就把该顶点放入队列中。此时,拓扑排序就是顶点出队的顺序

              

如果使用邻接表,执行这个算法所用的时间为O(|E| + |V|),因为for循环对每条边最多执行一次。而队列操作对每个顶点也最多进行一次,初始化花费的时间也和图的大小成正比



最短路径算法

对一个赋权图,与每条边(vi,vj)相联系的是穿越该弧的代价(或称为值)c i,j。一条路径v1,v2,...,vN的值是∑ c i,i+1(i = 1 ~ N-1),叫做赋权路径长(weighted path length)。而无权路径长(unweighted path length)只是路径上的边数,即N - 1

单源最短路径问题:给定一个赋权图G = (V,E)和一个特定顶点s作为输入,找出从s到G中每一个其他顶点的最短赋权路径

当边存在负值时,最短路径可能小于零,这个循环叫做负值圈(negative-cost cycle)。当它出现时,最短路径问题就是不确定的

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值