1. 程式人生 > >阿里巴巴2018實習生-演算法工程師筆試題2

阿里巴巴2018實習生-演算法工程師筆試題2

題目要求:

三年二班的同學們要去郊遊了,他們決定所有人都從一個地方出發,但是每個人都要有不同的路線,最終完成一次郊遊。所以他們想知道,在它們去的公園裡,究竟有多少種不同的路線供選擇。公園可以被描述為一個具有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)

歡迎留言,多多指教,向敬愛的社長學習