← 返回部落格列表 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 真題與陪練

聯絡方式