題目描述
有 n 個城市,按從 0 到 n-1 編號。給你乙個邊陣列 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromi 和 toi 兩個城市之間的雙向加權邊,距離閾值是乙個整數 distancethreshold。
返回能通過某些路徑到達其他城市數目最少、且路徑距離 最大 為 distancethreshold 的城市。如果有多個這樣的城市,則返回編號最大的城市。
注意,連線城市 i 和 j 的路徑的距離等於沿該路徑的所有邊的權重之和。
示例 1:
輸入:n = 4, edges = [[0,1,3],[1,2,1],[1,3,4],[2,3,1]], distancethreshold = 4
輸出:3
解釋:城市分布圖如上。
每個城市閾值距離 distancethreshold = 4 內的鄰居城市分別是:
城市 0 -> [城市 1, 城市 2]
城市 1 -> [城市 0, 城市 2, 城市 3]
城市 2 -> [城市 0, 城市 1, 城市 3]
城市 3 -> [城市 1, 城市 2]
城市 0 和 3 在閾值距離 4 以內都有 2 個鄰居城市,但是我們必須返回城市 3,因為它的編號最大。
示例 2:
輸入:n = 5, edges = [[0,1,2],[0,4,8],[1,2,3],[1,4,2],[2,3,1],[3,4,1]], distancethreshold = 2
輸出:0
解釋:城市分布圖如上。
每個城市閾值距離 distancethreshold = 2 內的鄰居城市分別是:
城市 0 -> [城市 1]
城市 1 -> [城市 0, 城市 4]
城市 2 -> [城市 3, 城市 4]
城市 3 -> [城市 2, 城市 4]
城市 4 -> [城市 1, 城市 2, 城市 3]
城市 0 在閾值距離 4 以內只有 1 個鄰居城市。
解題思路
djikstra演算法
這個演算法適合求單源最短路徑,即從乙個起點到其他點的最短距離,用到本題中也可以做,使用乙個for迴圈求每個點到其他點的路徑,再做比較即可。
網上看到兩篇djikstra演算法講得很清楚的部落格,特此記錄一下:
本題首先根據邊來構造鄰接矩陣,然後再使用djikstra演算法
class solution(object):def findthecity(self, n, edges, distancethreshold):
def djikstra(source, threshold):
maximum = float('inf')
neibour_matrix = [[maximum] * n for i in range(n)]
for i, j, w in edges:
neibour_matrix[i][i] = 0
neibour_matrix[j][j] = 0
neibour_matrix[i][j] = w
neibour_matrix[j][i] = w
passed = [source]
nopass = [x for x in range(n) if x != source]
dis = neibour_matrix[source]
while nopass:
idx = nopass[0]
for i in nopass:
if dis[i] < dis[idx]:
idx = i
nopass.remove(idx)
for i in nopass:
if dis[idx] + neibour_matrix[idx][i] < dis[i]:
dis[i] = dis[idx] + neibour_matrix[idx][i]
return [i for i in range(len(dis)) if dis[i] <= distancethreshold and dis[i] != 0]
num = n + 1
ret = -1
node_dict = {}
for i in range(n):
x = djikstra(i, distancethreshold)
if len(x) <= num:
ret = i
num = len(x)
return ret
s = solution()
print(s.findthecity(4, [[0,1,3],[1,2,1],[1,3,4],[2,3,1]], 4))
閾值距離內鄰居最少的城市
有 n 個城市,按從 0 到 n 1 編號。給你乙個邊陣列 edges,其中 edges i fromi,toi,weighti 代表 fromi 和 toi 兩個城市之間的雙向加權邊,距離閾值是乙個整數 distancethreshold。返回能通過某些路徑到達其他城市數目最少 且路徑距離 最大 ...
力扣)72 編輯距離
難度在於定義最優解的結構。根據動態規劃思想容易定義出dp i j 表示word1的前i段與word2的前j段的編輯距離。最難想到的是最優解的結構,即替換,刪除和插入三種操作可以分別用dp i 1 j 1 1,dp i 1 j 1和dp i j 1 1表示。dp i j 代表 word1 到 i 位置...
dp 力扣 72 編輯距離
給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3解釋 horse rorse 將 h 替換為 r...