本文主要是介绍数据结构与算法分析:图论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
图论算法
定义
路径:由一个顶点序列使得这样一条路径。
环:路径,路径长为0,为环。
简单路径:不包含环,所有顶点是互异的,但是第一个和最后一个可以是相同的。
圈:满足的路径称为圈,若各该路径是简单路径,则为简单圈。
连通的无向图:无向图中的每个顶点之间都有路径。
强连通的有向图:每个顶点之间都有路径。
有向图的基础图:去掉有向图上的弧所剩下的无向图。
弱连通的有向图:有向图的基础图为连通的,则该有向图为弱连通的。
完全图:每个顶点之间都存在一条边的图。
邻接矩阵:
邻接表:
拓扑排序
拓扑排序是对有向无圈图的顶点的一种排序,使得如果存在一条从的路径,那么再排序中就出现在的后面。
拓扑排序邻接表实现时间复杂度:
最短路径算法
单源最短路径问题
给定一个赋权图G=(V,E)和一个特定顶点s作为输入,找出s到G中每一个其他顶点的最短赋权路径。
无权最短路径
无权最短路径的队列实现时间复杂度为
Dijkstra算法(Dijkstra's algorithm)
迪杰斯特拉算法(Dijkstra's algorithm)是由荷兰计算机科学家艾兹赫尔·迪杰斯特拉提出。迪杰斯特拉算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。
该算法的输入包含了一个有权重的有向图 G,以及G中的一个来源顶点 S。我们以 V 表示 G 中所有顶点的集合。每一个图中的边,都是两个顶点所形成的有序元素对。(u, v) 表示从顶点 u 到 v 有路径相连。我们以 E 表示G中所有边的集合,而边的权重则由权重函数 w: E → [0, ∞] 定义。因此,w(u, v) 就是从顶点 u 到顶点 v 的非负权重(weight)。边的权重可以想像成两个顶点之间的距离。任两点间路径的权重,就是该路径上所有边的权重总和。已知有 V 中有顶点 s 及 t,Dijkstra 算法可以找到 s 到 t的最低权重路径(例如,最短路径)。这个算法也可以在一个图中,找到从一个顶点 s 到任何其他顶点的最短路径。对于不含负权的有向图,Dijkstra 算法是目前已知的最快的单源最短路径算法。
算法步骤:
1. 初始时令 S={V0},T={其余顶点},T中顶点对应的距离值
若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值
若不存在<V0,Vi>,d(V0,Vi)为∞
2. 从T中选取一个其距离值为最小的顶点W且不在S中,加入S
3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从 V0 到 Vi 的距离值缩短,则修改此距离值
重复上述步骤2、3,直到S中包含所有顶点,即W=Vi 为止
该算法运行时长为
无圈图
无圈图的最短路径算法可以借助拓扑排序来对Dijkstra算法进行优化,因此运行时间优化为。
网络流问题
最小生成树
无向图中寻找一颗最小生成树问题。
Prim算法
不使用堆的运行时间:
使用二叉堆的运行时间:
Kruskal算法
运行时间:
其他应用
欧拉回路
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,
称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。
哈密顿图
哈密顿图是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路,含有图中所有顶点的路径称作哈密顿路径。
NP问题
看下面的图,他们之间的关系表示的比较清楚。
P Problem:这个应该最易理解,就是一个问题可以在Polynominal的时间的得到解决,当然,是对于任意input size。
NP Problem:对于一类问题,我们可能没有一个已知的快速的方法得到问题的答案,但是如果给我们一个candidate answer,我们能够在polynominal的时间内验证这个candidate answer到底是不是我们已知问题的答案,这类问题叫做NP problem。所以很显然 P Problem是NP problem的一个子集。
NP-hard Problem:对于这一类问题,用一句话概括他们的特征就是"at least as hard as the hardest problems in NP Problem",就是NP-hard问题至少和NP问题一样难。
NP-complete Problem:对于这一类问题,他们满足两个性质,一个就是在polynomial时间内可以验证一个candidate answer是不是真正的解,另一个性质就是我们可以把任何一个NP问题在polynomial的时间内把他的input转化,使之成为一个NP-complete问题。
这篇关于数据结构与算法分析:图论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!