Use this to learn the idea, then write your own version.
123 45class Solution {6public:7 vector<int> minCost(int n, vector<int>& prices, vector<vector<int>>& roads) {8 static const auto& INF = numeric_limits<int64_t>::max();9 10 vector<vector<pair<int, int64_t>>> adj(2 * n);11 const auto& dijkstra = [&](int start, int target) {12 vector<int64_t> best(size(adj), INF);13 best[start] = 0;14 priority_queue<pair<int64_t, int>, vector<pair<int64_t, int>>, greater<pair<int64_t, int>>> min_heap;15 min_heap.emplace(best[start], start);16 while (!empty(min_heap)) {17 const auto [curr, u] = min_heap.top(); min_heap.pop();18 if (curr != best[u]) {19 continue;20 }21 if (u == target) {22 return curr;23 }24 for (const auto& [v, w] : adj[u]) {25 if (best[v] - curr <= w) {26 continue;27 }28 best[v] = curr + w;29 min_heap.emplace(best[v], v);30 }31 }32 return INF;33 };34 35 for (const auto& r : roads) {36 const auto u = r[0], v = r[1];37 const int64_t c = r[2], t = r[3];38 adj[u].emplace_back(v, c);39 adj[v].emplace_back(u, c);40 adj[u + n].emplace_back(v + n, c * t);41 adj[v + n].emplace_back(u + n, c * t);42 }43 for (int i = 0; i < n; ++i) {44 adj[i].emplace_back(i + n , prices[i]);45 }46 vector<int> result(n);47 for (int i = 0; i < n; ++i) {48 result[i] = dijkstra(i, i + n);49 }50 return result;51 }52};53 54555657class Solution2 {58public:59 vector<int> minCost(int n, vector<int>& prices, vector<vector<int>>& roads) {60 static const auto& INF = numeric_limits<int64_t>::max();61 62 vector<vector<vector<pair<int, int64_t>>>> adj(2, vector<vector<pair<int, int64_t>>>(n));63 const auto& dijkstra = [&](const auto& adj, int start) {64 vector<int64_t> best(size(adj), INF);65 best[start] = 0;66 priority_queue<pair<int64_t, int>, vector<pair<int64_t, int>>, greater<pair<int64_t, int>>> min_heap;67 min_heap.emplace(best[start], start);68 while (!empty(min_heap)) {69 const auto [curr, u] = min_heap.top(); min_heap.pop();70 if (curr != best[u]) {71 continue;72 }73 for (const auto& [v, w] : adj[u]) {74 if (best[v] - curr <= w) {75 continue;76 }77 best[v] = curr + w;78 min_heap.emplace(best[v], v);79 }80 }81 return best;82 };83 84 for (const auto& r : roads) {85 const auto u = r[0], v = r[1];86 const int64_t c = r[2], t = r[3];87 adj[0][u].emplace_back(v, c);88 adj[0][v].emplace_back(u, c);89 adj[1][u].emplace_back(v, c * t);90 adj[1][v].emplace_back(u, c * t);91 }92 vector<int> result(n);93 for (int i = 0; i < n; ++i) {94 vector<vector<int64_t>> dist = {dijkstra(adj[0], i), dijkstra(adj[1], i)};95 int64_t mn = INF;96 for (int j = 0; j < n; ++j) {97 if (dist[0][j] != INF && dist[1][j] != INF) {98 mn = min(mn, dist[0][j] + prices[j] + dist[1][j]);99 }100 }101 result[i] = mn;102 }103 return result;104 }105};106