1466. 重新规划路线
大约 3 分钟
--- 

1466. 重新规划路线
- 标签:深度优先搜索、广度优先搜索、图
- 难度:中等
题目链接
题目大意
描述:给定 座城市(编号 ),和 条有向边 ,表示从 到 的一条单向道路。
要求:返回最少需要改变方向的边数,使得所有道路都指向城市 (所有城市都能到达 )。
说明:
- 。
- 构成一棵树。
示例:
- 示例 1:

输入:n = 6, connections = [[0,1],[1,3],[2,3],[4,0],[4,5]]
输出:3
解释:更改以红色显示的路线的方向,使每个城市都可以到达城市 0 。- 示例 2:

输入:n = 5, connections = [[1,0],[1,2],[3,2],[3,4]]
输出:2
解释:更改以红色显示的路线的方向,使每个城市都可以到达城市 0 。解题思路
思路 1:DFS 或 BFS
1. 核心思想
由于图是一棵树,从 出发 BFS/DFS。对于每条边,如果是正向(从 向外),则需要反转。如果是反向(指向 ),则不需要。
具体做法:将图视为无向图,从 开始遍历,如果遇到的是原始图中的方向(),且需要从 走向方向箭头的尾部→头部,则说明这条边的方向不对,需要反转计数。
更简洁:建双向图并标记原始方向。从 开始 BFS,如果从一个节点沿着原始方向的出边走到邻居,则该边需要反转。
2. 具体步骤
第 1 步:建图。对每条边 ,加入两条边:
- 标记为正向()。
- 标记为反向()。
第 2 步:从 开始 BFS/DFS:
- 遍历邻居时,如果边标记为 (原始方向是远离 的方向),。
- 标记已访问。
第 3 步:返回 。
3. 举例说明
以 为例:
0 → 1 → 3 ← 2
↑
4 → 5从 BFS:
- 的邻居:(正向出→计数+1),(反向入←不计数)
- 的邻居:(正向出→计数+1)
- 的邻居:(已访问),(正向出→计数+1)
总计数 = 。
思路 1:代码
from collections import deque, defaultdict
class Solution:
def minReorder(self, n: int, connections: List[List[int]]) -> int:
graph = [[] for _ in range(n)]
for a, b in connections:
graph[a].append((b, 1)) # 正向:需要反转才指向 0
graph[b].append((a, 0)) # 反向:指向 0 的方向
q = deque([0])
visited = {0}
count = 0
while q:
u = q.popleft()
for v, direction in graph[u]:
if v not in visited:
visited.add(v)
if direction == 1: # 正向边 = 需要反转
count += 1
q.append(v)
return count思路 1:复杂度分析
- 时间复杂度:,每个节点访问一次。
- 空间复杂度:,邻接表和队列。