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

Description

There are n cities numbered from 0 to n-1 and n-1 roads such that there is only one way to travel between two different cities (this network form a tree). Last year, The ministry of transport decided to orient the roads in one direction because they are too narrow.

Roads are represented by connections where connections[i] = [a, b] represents a road from city a to b.

This year, there will be a big event in the capital (city 0), and many people want to travel to this city.

Your task consists of reorienting some roads such that each city can visit the city 0. Return the minimum number of edges changed.

It’s guaranteed that each city can reach the city 0 after reorder.

Example 1:
在这里插入图片描述

Input: n = 6, connections = [[0,1],[1,3],[2,3],[4,0],[4,5]]
Output: 3
Explanation: Change the direction of edges show in red such that each node can reach the node 0 (capital).

Example 2:
在这里插入图片描述

Input: n = 5, connections = [[1,0],[1,2],[3,2],[3,4]]
Output: 2
Explanation: Change the direction of edges show in red such that each node can reach the node 0 (capital).

Example 3:

Input: n = 3, connections = [[1,0],[2,0]]
Output: 0

Constraints:

  • 2 <= n <= 5 * 10^4
  • connections.length == n-1
  • connections[i].length == 2
  • 0 <= connections[i][0], connections[i][1] <= n-1
  • connections[i][0] != connections[i][1]

分析

题目的意思是:给定了n个城市,以及相连的有向边,问最少翻转多少条边才使得所有的城市都能够到达城市0.一开始我就卡在怎么建模上面了,后面发现就是一个无向图的遍历,或者是树的层序遍历。如果能够想到这个就可以用graph[i]表示与该城市i相连的城市j,及城市j,能够到达城市0所需要翻转的代价,所以是一个元组,包含两个元素;

  • 然后用队列模拟层序遍历,用visited记录遍历过的城市,其中对于当前未遍历到的城市边需要翻转一下,即计数+1.如果不是很懂,可以层序遍历模仿一下。

代码

class Solution:
    def minReorder(self, n: int, connections: List[List[int]]) -> int:
        graph=[[] for i in range(n)]
        for fr,to in connections:
            graph[fr].append((to,1))
            graph[to].append((fr,0))
        q=collections.deque([0])
        visited=[False]*n
        visited[0]=True
        cnt=0
        while(q):
            idx=q.popleft()
            for to in graph[idx]:
                if(not visited[to[0]]):
                    visited[to[0]]=True
                    cnt+=to[1]
                    q.append(to[0])
        return cnt

参考文献

[LeetCode] [Python] [BFS] Flag Routes by Direction

猜你喜欢

转载自blog.csdn.net/w5688414/article/details/109341016