【问题标题】:shortest single trip in the graph图中最短的单程
【发布时间】:2017-12-12 16:49:43
【问题描述】:

我是 Python 新手,遇到了以下问题。正在考虑用 BFS 解决,但没有。欢迎大家指点

给定一个航班列表(按任意顺序),构建该列表所代表的行程。例如,如果我们有从旧金山到洛杉矶的航班和从纽约市到旧金山的航班,则行程是“NYC to SFO to LAX”。 假设:

  • 一个城市每次旅行只能访问一次。 (您在访问某个城市后无法返回)。
  • 该列表仅代表一次旅行。
  • 输入不是来自文本文件。我们可以考虑输入任何数据结构,没有规范。
# Flights:
# ORD -> DNV
# SFO -> NYC
# LAX -> SFO
# NYC -> ORD
# 
# Trip / Output:
# LAX -> SFO -> NYC -> ORD -> DNV

感谢帮助

【问题讨论】:

  • 对我来说,一旦你选择了起点,这个问题似乎就相当确定了。您只想在提供的列表中找到使用所有航班的起点。你对这个程序有什么意见?它是一个将原点映射到目的地的字典吗?还是元组列表?还是……?
  • 输入:航班:# ORD -> DNV # SFO -> NYC # LAX -> SFO # NYC -> ORD 行程/输出:# LAX -> SFO -> NYC -> ORD -> DNV
  • 我将输入作为城市,飞行方向和输出如上所示。
  • 这是来自文本文件的输入吗?您是否必须先将其解析为数据结构或其他内容?
  • 输入不是来自文本文件。我们可以考虑输入任何数据结构,没有规范。

标签: python shortest-path


【解决方案1】:

假设您从以下输入开始:

flights = {'ORD': 'DNV', 'SFO': 'NYC', 'LAX': 'SFO', 'NYC': 'ORD'}

换句话说,我们将每个键映射到一个值(例如,'ORD' 映射到 'DNV')。

行程的起点必须是不用作值的键(即,不是某个其他航班的结束的航班的开始)。我们可以找到这个

origin = set(flights.keys()).difference(set(flights.values())).pop()

它创建一组键和一组值,并找到不在该组值中的键。

考虑到这一点,我们需要一种方法来构建停靠点列表。我们可以递归地做到这一点:

def get_flights(route, flights):
    if len(route) == 0:
        origin = set(flights.keys()).difference(set(flights.values())).pop()
        return get_flights([origin], flights)
    elif route[-1] in flights:
        return get_flights(route + [flights[route[-1]]], flights)
    else:
        return route

或作为循环

def get_flights_2(flights):
    origin = set(flights.keys()).difference(set(flights.values())).pop()
    route = [origin]

    while route[-1] in flights:
        route += [flights[route[-1]]]

    return route

从那里,我们只是调用该函数:

" -> ".join(get_flights(flights))

" -> ".join(get_flights_2(flights))

【讨论】:

  • @Pankaj,如果您有任何问题,请随时提问。
  • 这个问题不属于这里,你应该投票关闭它。
  • @Coal_,我不同意。也许这个问题问得不好(在这种情况下,请随时为 OP 发表评论,以建议如何改进问题或自行编辑),但它符合What topics can I ask about here? 页面上列出的所有标准。堆栈溢出的存在是为了帮助人们。你看过like this one的文章吗?他们是对的。让我们成为解决方案的一部分,而不是问题。对新用户怀有敌意对网站不利。
  • 有点晚了,但 OP 没有包含 任何 尝试解决问题。这根本不是问“家庭作业”问题的地方。是的,也许 StackOverflow 似乎对新用户怀有敌意,但那是因为它不断收到离题问题的垃圾邮件。
猜你喜欢
  • 2011-08-12
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2022-01-14
相关资源
最近更新 更多