Python 用BFS/DFS在有向无环图中寻找最大权路径

Python 用BFS/DFS在有向无环图中寻找最大权路径,python,data-structures,graph,tree,breadth-first-search,Python,Data Structures,Graph,Tree,Breadth First Search,你有一辆2005年的本田雅阁,油箱里还剩下50英里(最大重量)。在50英里半径范围内,您可以访问哪些麦当劳地点(图节点)?这是我的问题 如果你有一个加权有向无环图,你怎么能找到在给定的权重限制内可以访问的所有节点 我知道Dijkstra的算法,但除了min-path问题之外,我似乎找不到任何关于其使用的文档。在我的例子中,没有一个节点是我们想要结束的,我们只想在不超过最大重量的情况下尽可能地走远。似乎您应该能够使用BFS/DFS来解决这个问题,但我找不到在具有边权重的图中实现这些功能的文档(同样

你有一辆2005年的本田雅阁,油箱里还剩下50英里(最大重量)。在50英里半径范围内,您可以访问哪些麦当劳地点(图节点)?这是我的问题

如果你有一个加权有向无环图,你怎么能找到在给定的权重限制内可以访问的所有节点


我知道Dijkstra的算法,但除了min-path问题之外,我似乎找不到任何关于其使用的文档。在我的例子中,没有一个节点是我们想要结束的,我们只想在不超过最大重量的情况下尽可能地走远。似乎您应该能够使用BFS/DFS来解决这个问题,但我找不到在具有边权重的图中实现这些功能的文档(同样,在最小路径问题之外)

使用拓扑排序可以找到顶点V(本例中为麦当劳)的最长路径。我们可以从拓扑上对节点进行排序开始,因为拓扑上的排序总是返回源节点U,在加权路径的端点V之前。然后,因为我们现在可以访问一个数组,其中每个源顶点位于其所有相邻顶点之前,我们可以搜索从顶点U开始到顶点V结束的每条路径,并在数组中设置一个值,该值的索引与U对应,即我们找到的连接U到V的最大边权重。如果最大距离之和超过50,而没有到达麦当劳,我们可以回溯并探索从U到V的第二高权重路径,如果我们耗尽从顶点U退出的所有路径,则继续回溯。最终我们将到达一个麦当劳,这将是与原始源节点的最大距离的麦当劳,同时将总跨越距离保持在50以下

对于此问题,您需要从起始节点运行DFS。从起始节点的每个子节点向下递归图形,直到达到总权重超过50为止。如果在遍历过程中遇到麦当劳,则记录列表或集合中到达的节点。通过这样做,您将获得尽可能最有效的算法,因为您不必像这个问题的另一个答案所建议的那样创建完整的拓扑排序。即使该算法在技术上仍在O(ElogV)时间内运行,但当路径距离超过50时,通过在DFS上递归,可以避免在不必要时遍历整个图