← 返回博客列表 Amazon NG 真题:飞机航线遍历所有城市(欧拉路径)
Amazon

Amazon NG 真题:飞机航线遍历所有城市(欧拉路径)

2026-06-15

Amazon NG VO 每轮先 BQ 再编程,这道"飞机航线遍历所有城市"是其中一轮的编程题。很多人一看到"图 + 遍历"就误判成拓扑排序——其实它是欧拉路径。这篇按 oavoservice 学员的复盘讲清判定与解法,以及一个很妙的 follow-up:当每个机场只能飞往一个城市时,图退化成链表,题目随之降维。文末附 VO辅助 / VO代面 的对接路径,给正在校招、转码、SDE 求职的同学一个实战参考。


一、题目背景

维度 详情
轮次 Amazon NG VO 编程轮(先 BQ 后编程)
题型 图论 / 欧拉路径
语言 自选,Python 常见
考察 题型识别、图遍历、连通性、follow-up 降维

二、题目

给定一组飞机航线图(城市为节点,航线为边),问能否找到一条路线,让飞行员遍历所有航线(每条边走且仅走一次),把所有城市连起来。

三、拆题:这是欧拉路径,不是拓扑排序

很多 CCD(candidate)一看到"图 + 遍历"就误判成拓扑排序——其实不是。这题要求"每条边恰好走一次",正是欧拉路径(Eulerian Path)

判定条件(无向图):图连通,且度数为奇数的顶点恰好为 0 个(欧拉回路,可从任意点出发回到原点)或 2 个(欧拉路径,从一个奇度点走到另一个)。

def has_eulerian_path(n, edges):
    # 无向图:统计度数 + 连通性
    from collections import defaultdict
    deg = defaultdict(int)
    adj = defaultdict(list)
    for u, v in edges:
        deg[u] += 1
        deg[v] += 1
        adj[u].append(v)
        adj[v].append(u)

    odd = sum(1 for node in deg if deg[node] % 2 == 1)
    if odd not in (0, 2):
        return False

    # 连通性:从任一有边的点 DFS,确认所有有边的点都可达
    start = next(iter(deg))
    seen = set()
    stack = [start]
    while stack:
        u = stack.pop()
        if u in seen:
            continue
        seen.add(u)
        for v in adj[u]:
            if v not in seen:
                stack.append(v)
    return len(seen) == len(deg)

时间复杂度:O(V + E)。空间复杂度:O(V + E)。

四、Follow-up:每个机场只能飞往一个城市 → 退化成链表重建

追问:如果每个城市的机场只能到达一个城市(每个节点出度为 1),怎么优化?

这一限制让 input 从图退化成了链表:每个节点只有一个后继,整条航线就是一条单链。问题随之从欧拉路径变成了重建链表 / 找链表顺序——给定一堆 (from, to) 对,拼出从起点到终点的唯一顺序。

def reconstruct_route(pairs):
    # pairs: [(from, to)], 每个 from 唯一 → 实为单链表
    nxt = {a: b for a, b in pairs}
    targets = set(nxt.values())
    # 起点:从未作为任何边的终点出现
    start = next(a for a in nxt if a not in targets)
    route = [start]
    while route[-1] in nxt:
        route.append(nxt[route[-1]])
    return route

时间复杂度:O(n)。空间复杂度:O(n)。

刷题关注本质:图退化成链表后,万变不离其宗——结构变简单,解法也随之降维。认出这层退化,就能从复杂的欧拉路径快速切到 O(n) 的链表重建。

五、临场提醒


FAQ

Q1:飞机航线题为什么是欧拉路径不是拓扑排序?

因为要求"每条边恰好走一次",这正是欧拉路径的定义;拓扑排序解决的是有向无环图的节点先后顺序,二者不是一回事。无向图欧拉路径的判定是连通且奇度顶点数为 0 或 2。

Q2:欧拉路径和欧拉回路有什么区别?

欧拉回路要求起点终点相同,无向图里所有顶点度数为偶;欧拉路径起终点不同,恰好有 2 个奇度顶点(起点和终点)。两者都要求图连通(忽略孤立点)。

Q3:follow-up 里图为什么会退化成链表?

当每个节点出度限制为 1,每个城市只能飞往唯一一个城市,整个结构就成了"每个节点恰好一个后继"的单链——本质是链表。于是只需用哈希表建立 from→to,从起点顺着走即可,O(n) 重建。

Q4:Amazon NG 编程轮怎么高效准备?

按图论(欧拉路径 / 拓扑 / 连通)、树、链表、DP 分专题刷,每类限时练并口头讲思路,同时备好 BQ。需要按 Amazon NG 题型 + BQ 做限时 mock、逐题讲解或 VO辅助 / VO代面 全程对接,可以走下面的路径定制。


正在准备 Amazon NG VO?

Amazon NG 是 BQ + 编程的 loop,编程爱在经典图论题上设 follow-up 降维。oavoservice 提供 Amazon 全流程陪练:欧拉路径 / 图论 / 链表 / DP 高频题限时模拟,题型识别与 follow-up 应变逐题打磨,16 条 LP 的 STAR 故事同步准备。教练含大厂资深工程师与 Bar Raiser 视角,支持 VO辅助 / VO代面 全程对接。

立即添加微信 Coding0201获取 Amazon 真题与陪练

联系方式