第9章 图论算法

图的表示方法

  • 邻接矩阵 : adjacent matrix是一个二位数组,对于每条边(u,v),置A[u][v]等于true;否则,数组的元素就是false。如果边有一个,那么可以置A[u][v]等于该权,而使用一个很大或者很小的权作为标记表示不存在的边。适用于稠密的图
  • 邻接表 : adjacent list对于每一个顶点,我们使用一个表存放所有邻接的顶点。空间需求为O(|E| + |V|)

有关图的算法

  • 拓扑排序 : 是对有向无权图的顶点的一种排序,使得如果存在一条从vi到vj的路径,那么在排序中vj就出现在vi的后面。
  • 广度优先搜索 : 该方法按层处理顶点,距开始点最近的那些顶点首先被求值,而最远的那些顶点最后被求值。常用于求解有向无权最短路径问题
  • Dijkstra算法 : 解决单源s最短路径问题,是一种贪婪算法,(也是基于广度优先搜索,每次遍历更新被遍历节点子节点到s的距离:一开始为无穷,子节点可能被其它父节点更新过、这时取最小值即可)

最小生成树

  • 问题 : 一个无向图G的最小生成树就是由该图的那些连接G的所有顶点的边构成的树,且其总价值要最低
  • 总结 : 边的条数**|V|-1**;它包含每一个顶点,所以它是生成树
  • Prim算法 : 贪婪算法,选择边(u,v)使得(u,v)的值是所有u在树上v不在树上的边值最小者,直到剩余的点为空
  • Kruskal算法 : 贪婪算法,连续地按照最小的权选择边,并且当所选的边不产生圈时就把它作为所取定的边。

深度优先搜索

  • 思想 : 是先序遍历的推广,需要小心避免圈的出现(导致死循环),标记已经访问过的节点,并且对于尚未被标记的所有邻接顶点递归调用深度优先搜索。
  • 时间复杂度 : 如果使用邻接表,则执行遍历的总时间就是O(|E|+|V|)

术语

  • 双连通性 : 一个连通的无向图如果不存在被删除之后使得剩下的图不再连通的顶点,那么这样的无向连通图就称为双连通
  • 欧拉回路 : 在图中找到一条路径,使得该路径访问图的每条边恰好一次。

猜你喜欢

转载自blog.csdn.net/DMW2016/article/details/82975194