2020年4月6日夜6時45分31秒
問題の説明:
連結グラフ無向非環式、X [i]は、Y 2つの頂点[Iによって各エッジが存在する ] 説明し、各辺の長さは、[i]はdで説明します。
このような点を求めてp
、その結果、他の点p
の最小距離と、そのような複数の点がある場合p
、最も小さい番号が返されます。
サンプル
例1:
给出 x = `[1]`, y = `[2]`, d = `[3]`, 返回 `1`。 输入: [1] [2] [3] 输出: 1 解释: 其他点到 1 的距离和为 3,其他点到 2 的距离和为 3,1 的编号较小。
サンプル2:
给出 x = `[1,2,2]`, y = `[2,3,4]`, d = `[1,1,1]`, 返回 `2`。 输入: [1,2,2] [2,3,4] [1,1,1] 输出: 2 解释: 其他点到 1 的距离和为 5,其他点到 2 的距离和为 3,其他点到 3 的距离和为 5,其他点到 4 的距离和为 5。
注意事項
2 <= n, d[i] <= 10^5
1 <= x[i], y[i] <= n
問題解決:
パスや木などが、ここで右辺の値。
時間の複雑さ:O(n)は、
地図<Integer型、セット<整数[] >>グラフ=新しいHashMapの<>(); 地図<整数、整数> CNT =新しいHashMapの<>(); 地図<整数、ロング>合計=新しいHashMapの<>(); 一覧<ロング[]>録音=新しいArrayListを<>(); 公共INT getFermatPoint(INT [] X、INT [] Y、INT [] D){ ため(INT iが= 0; I <x.length; I ++){ = X [i]とからINT。 = Y [i]は、INT。 W = D INT [i]は、 もし(graph.containsKey()から!)graph.put(新しいHashSetの<>()、から)。 もし(graph.containsKey()へ!)graph.put(新しいHashSetの<>()、へ)。 graph.get(から)が(新しいINT [] {に、wは}).add。 graph.get(TO)(新しいINT [] {W、からを}).add。 DFS2(X [0]、-1)。 プライベートボイドDFS1(INT根、INT親){ Collections.sort(レコード、(長い[] O1、長い[] O 2) - > O1 [0] == O 2 [0] Long.compare(O1 [1]、O [1]):Long.compare(O1 [0]は、O2 [0])); リターン(INT)record.get(0)[1]。 } プライベートボイドDFS2(INT根、INT親){ record.add(新しい長い[] {sum.get(根)、ルート})。 (INT []次:graph.get(ルート))のために{ (次の[0] ==親)が続けば、 長い= W(長い)次の[1]。 長いCURR = sum.get(ルート)+(ロング)(cnt.size() - cnt.get(次の[0])* 2)* W。 sum.put(次の[0]、CURR)。 DFS2(次の[0]、根)。 } } int型curr_cnt = 1; 長いcurr_sum = 0; (INT []次:graph.get(ルート))のために{ (次の[0] ==親)が続けば、 DFS1(次の[0]、根)。 curr_cnt + = cnt.get(次の[0])。 curr_sum + = sum.get(次の[0])+(長い)次の[1] *(長い)cnt.get(次の[0])。 } cnt.put(根、curr_cnt)。 sum.put(根、curr_sum)。 }