持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
一些经典的图论问题
使用图论来表述问题的一个好处是,有众所周知的算法可以解决图上的许多优化问题。一些最著名的图形优化问题是:
最短路径。对于某些节点对 ni 和 n2,查找边的最短序列<s、d>(源节点和目标节点),使得
o 第一条边中的源节点是 ni。o 最后一条边的目标节点为 n2。
o 对于序列中的所有边 e1 和 e2,如果 ez 在序列中跟随 er,则 ez 的源节点是 ei 的目标节点。
.
最短加权路径。这就像最短的路径,除了不是选择连接两个节点的最短边序列,而是在序列中边的权重上定义一些函数(例如,它们的总和)并最小化该值。这是谷歌和苹果地图在被要求计算两点之间的行车方向时解决的问题。
• 最小切割。给定图形中的两组节点,切口是一组边,其移除会消除从一组中的每个节点到另一组节点的所有路径。
•最大集团。一个组是一组节点,使得集合中的每对节点之间有一条边.93 最大组是图形中大小最大的组。最小切口是其移除可实现此目的的最小边集。
最短路径:深度优先搜索和广度优先搜索
社交网络由个人和个人之间的关系组成。这些通常建模为图形,其中个体是节点和边缘关系。如果关系是对称的,则边是无向的;如果关系是不对称的,则边是定向的。一些社交网络对多种关系进行建模,在这种情况下,边缘上的标签表示关系的类型。
1990年,剧作家约翰·瓜尔写了《六度分离》。这部剧背后的可疑前提是“这个星球上的每个人都只有六个人分开。”他的意思是,如果我们建立一个包括每个人的社交网络。
在地球上,使用“知道”的关系,任何两个人之间的最短路径最多会通过六个其他节点。一个不那么假设的问题是Facebook上成对的人之间使用“朋友”关系的距离。例如,您可能想知道您是否有一个朋友,他的朋友有一个朋友是Lady Gaga的朋友。让我们考虑设计一个程序来回答这些问题。
朋友关系(至少在Facebook上)是对称的,例如,如果山姆是安德里亚的朋友,安德里亚就是山姆的朋友。因此,我们将使用图形类型实现社交网络。然后,我们可以将查找您与Lady Gaga之间最短连接的问题定义为:
.
设 G 为表示友元关系的图。.
对于 G,找到最短的节点序列,[你,....,夫人嘎嘎],这样
.
如果 n 和 nit1 是序列中的连续节点,则 G 中有一条连接 n 的边,并且 ni+1”
图 14-9。包含一个递归函数,该函数在 Digraph 中查找两个节点(开始和结束)之间的最短路径。由于图形是双图的子类,因此它将适用于我们的Facebook问题。
DES 实现的算法是递归深度优先搜索 (DFS) 算法的一个示例。通常,深度优先搜索算法首先选择起始节点的一个子节点。然后,它选择该节点的一个子节点,依此类推,越来越深入,直到它到达目标节点或没有子节点的节点。然后,搜索将回溯,返回到包含尚未访问的子节点的最新节点。探索完所有路径后,它会选择从起点到目标的最短路径(假设有一条路径)。
代码比我们刚才描述的算法更复杂,因为它必须处理图形的可能性包含循环。它还避免了探索比已找到的最短路径更长的路径。
• 函数最短路径调用路径 = [1(指示正在探索的当前路径为空)和最短路径 == 无(指示尚未找到从头到尾的路径)的 DFS。
.
DFS 首先选择一个子项。然后,它选择该节点的一个子节点,依此类推,直到它到达节点端。或没有未访问子级的节点。
o 检查节点是否不在路径中可防止程序在循环中捕获。
o 检查最短 == 无 或 len (路径) < len (最短) 用于确定是否有可能继续搜索此路径可能会产生比迄今为止找到的最佳路径更短的路径。
o 如果是这样,则以递归方式调用 DFS。如果它找到的结束路径的长度不超过迄今为止找到的最佳路径,则会更新最短路径。o 当路径上的最后一个节点没有子节点可供访问时,程序将回溯到先前访问的节点并访问该节点的下一个子节点。
.
当探索了从开始到结束的所有可能的最短路径时,该函数将返回。
图 14-10 包含一些运行图 14= 9 中的代码的代码。图 14-10 中的函数test_SP首先构建如图所示的有向图,然后搜索节点 o 和节点 5 之间的最短路径。