Skip to content

1466. Reorder Routes to Make All Paths Lead to the City Zero

Coding5 min read

1466. Reorder Routes to Make All Paths Lead to the City Zero

這個題目是個滿好的面試題目,題目給定了一個每個城市之間是如何連結的,以及連結的方向,要問如何在現行的城市道路中,把最少的道路改方向,可以讓每個城市都可以通到城市 0 。

這個題目的解題思路真的滿難想的,可以用比較極端的例子來思考這個題目,假設今天所有的城市都是從 0 開始向外輻射的,這樣的情況就是每個道路都需要改方向,反之就是如果所有的城市都已經有向 0 方向的道路了,那我們就不需要改變道路的方向。

而題目給的表達式,其實是具有方向性的,我們就可以利用這個方向性,來完成這個題目。

用一個例子:如果今天有三個城市 [0, 1, 2] ,題目中有一個連結是 [1, 2] 這樣就代表的是城市 1 和 城市 2 是由 1 往 2 的方向,要滿足題目的條件的話,那就是我們需要改變方向。但是如果今天這個連結的表達式是 [2, 1] 的話,就表達是城市 2 往城市 1 的方向,並不需要改方向。

在這樣的情況下,可以這樣想:如果從 0 開始遍歷整棵樹時,從 0 到 2 的情況,題目會是給定上述的哪種方式,如果是 [1, 2] 那就需要改方向,如果是 [2, 1] 就不需要改方向。

這樣可以在建立該樹的圖形時,題目給定順向方向,在樹的遍歷時,是需要改變方向的,題目如果給定的是逆向方向,在樹的遍歷時,已經滿足題目的條件,是不需要改變方向的。

自此可以用建立無向圖的方式建立起整棵樹,並且設定上述的條件,最後使用 DFS 或是 BFS 來遍歷整棵樹,如果遇到順向的方向,就需要改變方向,把需要改變方向的計數器加一,最後就可以得到題目所問的數字。

class Solution:

    def minReorder(self, n: int, connections: List[List[int]]) -> int:

        self.res = 0
        graph = defaultdict(list)
        for connection in connections:
            graph[connection[0]].append((connection[1], 1))
            graph[connection[1]].append((connection[0], 0))

        visited = set()
        def dfs(root):
            visited.add(root)
            for node, sign in graph[root]:
                if node not in visited:
                    self.res += sign
                    dfs(node)
        dfs(0)
        return self.res