python语音规划路线_重新规划路线(python)
問題描述
n 座城市,從 0 到 n-1 編號,其間共有 n-1 條路線。因此,要想在兩座不同城市之間旅行只有唯一一條路線可供選擇(路線網形成一顆樹)。去年,交通運輸部決定重新規劃路線,以改變交通擁堵的狀況。
路線用 connections 表示,其中 connections[i] = [a, b] 表示從城市 a 到 b 的一條有向路線。
今年,城市 0 將會舉辦一場大型比賽,很多游客都想前往城市 0 。
請你幫助重新規劃路線方向,使每個城市都可以訪問城市 0 。返回需要變更方向的最小路線數。
題目數據 保證 每個城市在重新規劃路線方向后都能到達城市 0 。
例子
image.png
思路:類似廣度優先搜索的思想,從初始節點開始,然后遍歷與其相鄰的節點,然后再遍歷這些節點的相鄰節點。而這題遍歷的時候去考慮邊的情況,如果該邊指向的是他前一個節點,則符合,反之,則不符合,需要變更方向。
python實現:
1,隊列(超出時間限制)
class Solution:
def minReorder(self, n: int, connections: List[List[int]]) -> int:
c=connections
que=[0]#存儲需要遍歷的節點
res=0
while que: #判斷節點是否全部遍歷完
x=que.pop() #出隊列
k=0
while k
if c[k][1]==x: #邊指向之前節點
que.append(c[k][0]) #加入下一節點
c.pop(k) #將遍歷的邊刪除
continue #繼續下一次遍歷
elif c[k][0]==x:
res+=1 #變更次數加一
que.append(c[k][1])
c.pop(k)
continue
k+=1
return res
改進第一種方法
class Solution:
def minReorder(self, n: int, connections: List[List[int]]) -> int:
c=connections
ans = 0
now = {0} #存儲需要遍歷的節點的集合
while len(now) != n: #判斷集合長度是否達到n
new = set() #新建集合
i = 0
while i < len(c): #遍歷存儲邊的列表
if c[i][1] in now:
new.add(c[i][0])#將下次要遍歷的節點保存起來
c.pop(i) #刪除邊
continue
elif c[i][0] in now:
ans += 1
new.add(c[i][1])
c.pop(i)
continue
i += 1
now |= new #將集合new加進集合now中
return ans
繼續改進
class Solution:
def minReorder(self, n: int, connections: List[List[int]]) -> int:
res = 0
ordered_set = {0} # 保存已經能正確到達0的城市
for (l, r) in connections:
if r in ordered_set: # r是已經能到0的城市,那么l->r后就可到0
ordered_set.add(l)
elif l in ordered_set: # r目前不可到城市0,l可到,那就讓r->l后到0,重修+1
res += 1
ordered_set.add(r)
return res
總結
以上是生活随笔為你收集整理的python语音规划路线_重新规划路线(python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iis8 php mysql_windo
- 下一篇: visual studio安装pytho