当前位置: 面试刷题>> 重新安排行程 (经典算法题500道)


### 题目描述 **重新安排行程** 给定一系列航班信息,包括出发地和目的地,你需要重新安排这些航班的顺序,使得从某一城市出发的乘客能够到达目的地,且满足以下条件: 1. 每一架航班必须被安排一次且仅一次。 2. 航班的出发地必须是上一航班的目的地(或起始城市)。 3. 不存在环,即最终每个乘客都能到达目的地,而不是回到起点形成闭环。 **输入**: - 航班信息以列表形式给出,每个元素是一个二元组 (start, end),表示从 start 飞往 end 的航班。 - 一个起始城市作为起点。 **输出**: - 如果可以重新安排行程,则返回一个行程列表,列表中的元素按照访问顺序排列。 - 如果无法重新安排行程(例如,存在无法到达的航班或闭环),则返回空列表。 **示例**: 输入: ``` flights = [("KCL", "LHR"), ("JFK", "KCL"), ("SFO", "SJC"), ("LHR", "SFO")] start = "JFK" ``` 输出: ``` ["JFK", "KCL", "LHR", "SFO", "SJC"] ``` ### PHP 示例代码 ```php function findItinerary($flights, $start) { $graph = array_fill_keys(array_keys(array_column($flights, 0)), []); foreach ($flights as $flight) { $graph[$flight[0]][] = $flight[1]; } $result = []; backtrack($graph, $start, $result); return empty($result) ? [] : array_reverse($result); } function backtrack(&$graph, $city, &$result) { if (empty($graph[$city])) { $result[] = $city; return true; } while (!empty($graph[$city])) { $nextCity = array_shift($graph[$city]); if (backtrack($graph, $nextCity, $result)) { return true; } } // 回溯,尝试其他路径 array_push($graph[$city], $nextCity); return false; } // 示例用法 $flights = [["KCL", "LHR"], ["JFK", "KCL"], ["SFO", "SJC"], ["LHR", "SFO"]]; $start = "JFK"; print_r(findItinerary($flights, $start)); ``` **注意**:PHP 示例中,航班信息需要稍作修改以适应 PHP 数组结构。 ### Python 示例代码 ```python def findItinerary(flights, start): graph = collections.defaultdict(list) for start, end in flights: graph[start].append(end) result = [] def backtrack(city): while graph[city]: next_city = graph[city].pop(0) if backtrack(next_city): result.append(next_city) return True # 回溯 graph[city].append(next_city) result.append(city) return True backtrack(start) return result[::-1] # 示例用法 import collections flights = [("KCL", "LHR"), ("JFK", "KCL"), ("SFO", "SJC"), ("LHR", "SFO")] start = "JFK" print(findItinerary(flights, start)) ``` ### JavaScript 示例代码 ```javascript function findItinerary(flights, start) { const graph = {}; for (const [startCity, endCity] of flights) { if (!graph[startCity]) graph[startCity] = []; graph[startCity].push(endCity); } const result = []; function backtrack(city) { while (graph[city].length > 0) { const nextCity = graph[city].shift(); if (backtrack(nextCity)) { result.push(nextCity); return true; } // 回溯 graph[city].push(nextCity); } result.push(city); return true; } backtrack(start); return result.reverse(); } // 示例用法 const flights = [["KCL", "LHR"], ["JFK", "KCL"], ["SFO", "SJC"], ["LHR", "SFO"]]; const start = "JFK"; console.log(findItinerary(flights, start)); ``` **码小课**网站中有更多关于算法和数据结构的内容分享,欢迎大家学习交流。
推荐面试题