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

网友投稿 769 2022-08-22

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

[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: 3Explanation: 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: 2Explanation: 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^4connections.length == n-1connections[i].length == 20 <= connections[i][0], connections[i][1] <= n-1connections[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​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:用C语言写面向的对象是一种什么样的体验(c语言面向对象吗)
下一篇:[leetcode] 1530. Number of Good Leaf Nodes Pairs
相关文章

 发表评论

暂时没有评论,来抢沙发吧~