光明小學的小朋友們要舉行一年一度的接力跑大賽了,可是小朋友們卻遇到了一個難題:設計接力跑大賽的線路,你能幫助他們完成這項工做麼?
光明小學能夠抽象成一張有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