阿里算法題-2019屆

光明小學的小朋友們要舉行一年一度的接力跑大賽了,可是小朋友們卻遇到了一個難題:設計接力跑大賽的線路,你能幫助他們完成這項工做麼?
光明小學能夠抽象成一張有N個節點的圖,每兩點間都有一條道路相連。光明小學的每一個班都有M個學生,因此你要爲他們設計出一條剛好通過M條邊的路徑。
光明小學的小朋友們但願全盤考慮全部的因素,因此你須要把任意兩點間通過M條邊的最短路徑的距離輸出出來以供參考。數組

你須要設計這樣一個函數:
res[][] Solve( N, M, map[][]);
注意:map必然是N * N的二維數組,且map[i][j] == map[j][i],map[i][i] == 0,-1e8 <= map[i][j] <= 1e8。(道路所有是無向邊,無自環)2 <= N <= 100, 2 <= M <= 1e6。要求時間複雜度控制在O(N^3*log(M))。app

map數組表示了一張稠密圖,其中任意兩個不一樣節點i,j間都有一條邊,邊的長度爲map[i][j]。N表示其中的節點數。
你要返回的數組也必然是一個N * N的二維數組,表示從i出發走到j,通過M條邊的最短路徑
你的路徑中應考慮包含重複邊的狀況。函數

輸入樣例:spa

3
2
3 3 
0 2 3
2 0 1
3 1 0設計

輸出樣例:code

[[4, 4, 3],blog

[4, 2, 5],input

[3, 5, 2]]it

 

 1 if __name__=='__main__':
 2     #   未添加邊界值的檢查
 3     n = int(raw_input())
 4     m = int(raw_input())
 5     x = raw_input()
 6     map = []
 7     for i in range(n):
 8         line = [int(x) for x in raw_input().split()]
 9         map.append(list(line))
10     
11     pre_mat = [list(x) for x in map]
12     c_mat = [list(x) for x in map]
13     
14     for _ in range(m-1):
15         for start in range(n):
16             for end in range(start, n):
17                 paths = [map[start][mid]+pre_mat[mid][end] for mid in range(n) if mid!=start and pre_mat[mid][end]!=0]
18                 c_mat[start][end]=c_mat[end][start]=min(paths)
19         pre_mat = [list(x) for x in c_mat]
20     
21     print c_mat

 

30分鐘,涼涼.....class

相關文章
相關標籤/搜索