阿里巴巴2018實習生-演算法工程師筆試題2
阿新 • • 發佈:2019-02-16
題目要求:
三年二班的同學們要去郊遊了,他們決定所有人都從一個地方出發,但是每個人都要有不同的路線,最終完成一次郊遊。所以他們想知道,在它們去的公園裡,究竟有多少種不同的路線供選擇。公園可以被描述為一個具有N個結點,M條有向邊的圖,你要做的任務就是,選擇其中某個點,使得其能夠產生儘量多的從這個點出發的路線。
提示:此處可以利用node代表結點的總數,結點編號從0到node-1。edge用來描述邊。你的程式應該返回路徑最多的結點對應的路徑數。
注意:所有的邊都是有向邊!資料輸入將保證不包含環路,不包括重複的邊。
輸入資料示例:
node = 4 edge = {{0, 1}, {1, 2}, {2, 3}, {0, 2}},包含4條有向邊
輸出結果:5
示例解釋:顯然,0號節點應該是起點。對應的5條路線為:
0 1
0 1 2
0 1 2 3
0 2
0 2 3
Python實現
# 阿里巴巴2018實習生-演算法工程師附加捲-程式設計題2 # 解題思路:運用鄰接表的思想。定義兩個字典,s_pre存放前面路徑可以到達該路徑的結點編號,s_after存放該路徑可以到達的結點編號。遍歷一遍所有的邊,得出結果。 # Created on 2018年5月12日 # @author: Hobart # s_pre {1: [0], 2: [0, 0, 1], 3: [0, 0, 1, 2]} # s_after {0: [1, 2], 1: [2], 2: [3]} # num {0: 5, 1: 2, 2: 1} # 5 def maxPath(data): num={} s_pre={} s_after={} for value in data: val_after=[] if value[0] in s_after and value[1] in s_after[value[0]] else [value[1]] s_after[value[0]]=s_after.get(value[0],[])+s_after.get(value[1],[])+val_after # 該路徑上開始結點之後可以經過的結點 val_pre=[] if value[1] in s_pre and value[0] in s_pre[value[1]] else [value[0]] s_pre[value[1]]= s_pre.get(value[1],[])+s_pre.get(value[0],[])+val_pre # 該路徑上結尾結點之前經過的結點 num[value[0]]=num.get(value[0],0)+1+(len(s_after[value[1]]) if value[1] in s_after else 0)#該路徑結點擁有的路徑數 if value[0] in s_pre: # 更近之前可以到達該路徑的結點所能到達的節點數 for i in s_pre[value[0]]: num[i]=num[i]+1+(len(s_after[value[1]]) if value[1] in s_after else 0) m=max(num.items(), key=lambda x: x[1]) return list(m)[1] s = [[0, 1],[1, 2], [2, 3], [0, 2]] s1=[[0, 1], [0, 2],[0,4], [1, 2], [2, 3],[4,2]] data=sorted(s,key=lambda x: (x[0], x[1])) # 對資料進行從小到大排序 result=maxPath(data) print(result)
歡迎留言,多多指教,向敬愛的社長學習