|
54 | 54 |
|
55 | 55 | <!-- 这里可写通用的实现逻辑 -->
|
56 | 56 |
|
| 57 | +**方法一:堆优化版 Dijkstra 算法** |
| 58 | + |
| 59 | +我们枚举起点,对于每个起点,使用 Dijkstra 算法求出到其他所有点的最短距离,更新最小值即可。 |
| 60 | + |
| 61 | +时间复杂度 $O(n \times m \times \log m)$,其中 $n$ 和 $m$ 分别是城市数量和道路数量。 |
| 62 | + |
57 | 63 | <!-- tabs:start -->
|
58 | 64 |
|
59 | 65 | ### **Python3**
|
60 | 66 |
|
61 | 67 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
62 | 68 |
|
63 | 69 | ```python
|
| 70 | +class Solution: |
| 71 | + def minCost(self, n: int, roads: List[List[int]], appleCost: List[int], k: int) -> List[int]: |
| 72 | + def dijkstra(i): |
| 73 | + q = [(0, i)] |
| 74 | + dist = [inf] * n |
| 75 | + dist[i] = 0 |
| 76 | + ans = inf |
| 77 | + while q: |
| 78 | + d, u = heappop(q) |
| 79 | + ans = min(ans, appleCost[u] + d * (k + 1)) |
| 80 | + for v, w in g[u]: |
| 81 | + if dist[v] > dist[u] + w: |
| 82 | + dist[v] = dist[u] + w |
| 83 | + heappush(q, (dist[v], v)) |
| 84 | + return ans |
64 | 85 |
|
| 86 | + g = defaultdict(list) |
| 87 | + for a, b, c in roads: |
| 88 | + a, b = a - 1, b - 1 |
| 89 | + g[a].append((b, c)) |
| 90 | + g[b].append((a, c)) |
| 91 | + return [dijkstra(i) for i in range(n)] |
65 | 92 | ```
|
66 | 93 |
|
67 | 94 | ### **Java**
|
68 | 95 |
|
69 | 96 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
70 | 97 |
|
71 | 98 | ```java
|
| 99 | +class Solution { |
| 100 | + private int k; |
| 101 | + private int[] cost; |
| 102 | + private int[] dist; |
| 103 | + private List<int[]>[] g; |
| 104 | + private static final int INF = 0x3f3f3f3f; |
| 105 | + |
| 106 | + public long[] minCost(int n, int[][] roads, int[] appleCost, int k) { |
| 107 | + cost = appleCost; |
| 108 | + g = new List[n]; |
| 109 | + dist = new int[n]; |
| 110 | + this.k = k; |
| 111 | + for (int i = 0; i < n; ++i) { |
| 112 | + g[i] = new ArrayList<>(); |
| 113 | + } |
| 114 | + for (var e : roads) { |
| 115 | + int a = e[0] - 1, b = e[1] - 1, c = e[2]; |
| 116 | + g[a].add(new int[] {b, c}); |
| 117 | + g[b].add(new int[] {a, c}); |
| 118 | + } |
| 119 | + long[] ans = new long[n]; |
| 120 | + for (int i = 0; i < n; ++i) { |
| 121 | + ans[i] = dijkstra(i); |
| 122 | + } |
| 123 | + return ans; |
| 124 | + } |
| 125 | + |
| 126 | + private long dijkstra(int u) { |
| 127 | + PriorityQueue<int[]> q = new PriorityQueue<>((a, b) -> a[0] - b[0]); |
| 128 | + q.offer(new int[] {0, u}); |
| 129 | + Arrays.fill(dist, INF); |
| 130 | + dist[u] = 0; |
| 131 | + long ans = Long.MAX_VALUE; |
| 132 | + while (!q.isEmpty()) { |
| 133 | + var p = q.poll(); |
| 134 | + int d = p[0]; |
| 135 | + u = p[1]; |
| 136 | + ans = Math.min(ans, cost[u] + (long) (k + 1) * d); |
| 137 | + for (var ne : g[u]) { |
| 138 | + int v = ne[0], w = ne[1]; |
| 139 | + if (dist[v] > dist[u] + w) { |
| 140 | + dist[v] = dist[u] + w; |
| 141 | + q.offer(new int[] {dist[v], v}); |
| 142 | + } |
| 143 | + } |
| 144 | + } |
| 145 | + return ans; |
| 146 | + } |
| 147 | +} |
| 148 | +``` |
| 149 | + |
| 150 | +### **C++** |
| 151 | + |
| 152 | +```cpp |
| 153 | +using ll = long long; |
| 154 | +using pii = pair<int, int>; |
| 155 | + |
| 156 | +class Solution { |
| 157 | +public: |
| 158 | + const int inf = 0x3f3f3f3f; |
| 159 | + |
| 160 | + vector<long long> minCost(int n, vector<vector<int>>& roads, vector<int>& appleCost, int k) { |
| 161 | + vector<vector<pii>> g(n); |
| 162 | + for (auto& e : roads) { |
| 163 | + int a = e[0] - 1, b = e[1] - 1, c = e[2]; |
| 164 | + g[a].push_back({b, c}); |
| 165 | + g[b].push_back({a, c}); |
| 166 | + } |
| 167 | + int dist[n]; |
| 168 | + auto dijkstra = [&](int u) { |
| 169 | + memset(dist, 63, sizeof dist); |
| 170 | + priority_queue<pii, vector<pii>, greater<pii>> q; |
| 171 | + q.push({0, u}); |
| 172 | + dist[u] = 0; |
| 173 | + ll ans = LONG_MAX; |
| 174 | + while (!q.empty()) { |
| 175 | + auto p = q.top(); |
| 176 | + q.pop(); |
| 177 | + int d = p.first; |
| 178 | + u = p.second; |
| 179 | + ans = min(ans, appleCost[u] + 1ll * d * (k + 1)); |
| 180 | + for (auto& ne : g[u]) { |
| 181 | + auto [v, w] = ne; |
| 182 | + if (dist[v] > dist[u] + w) { |
| 183 | + dist[v] = dist[u] + w; |
| 184 | + q.push({dist[v], v}); |
| 185 | + } |
| 186 | + } |
| 187 | + } |
| 188 | + return ans; |
| 189 | + }; |
| 190 | + vector<ll> ans(n); |
| 191 | + for (int i = 0; i < n; ++i) ans[i] = dijkstra(i); |
| 192 | + return ans; |
| 193 | + } |
| 194 | +}; |
| 195 | +``` |
| 196 | + |
| 197 | +### **Go** |
| 198 | + |
| 199 | +```go |
| 200 | +func minCost(n int, roads [][]int, appleCost []int, k int) []int64 { |
| 201 | + g := make([]pairs, n) |
| 202 | + for _, e := range roads { |
| 203 | + a, b, c := e[0]-1, e[1]-1, e[2] |
| 204 | + g[a] = append(g[a], pair{b, c}) |
| 205 | + g[b] = append(g[b], pair{a, c}) |
| 206 | + } |
| 207 | + const inf int = 0x3f3f3f3f |
| 208 | + dist := make([]int, n) |
| 209 | + dijkstra := func(u int) int64 { |
| 210 | + var ans int64 = math.MaxInt64 |
| 211 | + for i := range dist { |
| 212 | + dist[i] = inf |
| 213 | + } |
| 214 | + dist[u] = 0 |
| 215 | + q := make(pairs, 0) |
| 216 | + heap.Push(&q, pair{0, u}) |
| 217 | + for len(q) > 0 { |
| 218 | + p := heap.Pop(&q).(pair) |
| 219 | + d := p.first |
| 220 | + u = p.second |
| 221 | + ans = min(ans, int64(appleCost[u]+d*(k+1))) |
| 222 | + for _, ne := range g[u] { |
| 223 | + v, w := ne.first, ne.second |
| 224 | + if dist[v] > dist[u]+w { |
| 225 | + dist[v] = dist[u] + w |
| 226 | + heap.Push(&q, pair{dist[v], v}) |
| 227 | + } |
| 228 | + } |
| 229 | + } |
| 230 | + return ans |
| 231 | + } |
| 232 | + ans := make([]int64, n) |
| 233 | + for i := range ans { |
| 234 | + ans[i] = dijkstra(i) |
| 235 | + } |
| 236 | + return ans |
| 237 | +} |
| 238 | + |
| 239 | +func min(a, b int64) int64 { |
| 240 | + if a < b { |
| 241 | + return a |
| 242 | + } |
| 243 | + return b |
| 244 | +} |
| 245 | + |
| 246 | +type pair struct{ first, second int } |
| 247 | + |
| 248 | +var _ heap.Interface = (*pairs)(nil) |
| 249 | + |
| 250 | +type pairs []pair |
72 | 251 |
|
| 252 | +func (a pairs) Len() int { return len(a) } |
| 253 | +func (a pairs) Less(i int, j int) bool { |
| 254 | + return a[i].first < a[j].first || a[i].first == a[j].first && a[i].second < a[j].second |
| 255 | +} |
| 256 | +func (a pairs) Swap(i int, j int) { a[i], a[j] = a[j], a[i] } |
| 257 | +func (a *pairs) Push(x interface{}) { *a = append(*a, x.(pair)) } |
| 258 | +func (a *pairs) Pop() interface{} { l := len(*a); t := (*a)[l-1]; *a = (*a)[:l-1]; return t } |
73 | 259 | ```
|
74 | 260 |
|
75 | 261 | ### **TypeScript**
|
|
0 commit comments