Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <set>
- using namespace std;
- long long dijkstra(int s, int n, vector<long long> &station_prices, vector<vector<pair<int, long long>>> &graph) {
- vector<long long> d;
- d.assign(n, INT64_MAX / 10);
- long long initial_price = station_prices[s];
- auto copy_edges_from_s = graph[s];
- for (int u = 0; u < n; ++u) {
- if (u != s) {
- graph[s].emplace_back(u, station_prices[u]);
- }
- }
- d[s] = 0;
- set<pair<long long, int>> queue;
- queue.emplace(0, s);
- while (!queue.empty()) {
- int v = queue.begin()->second;
- queue.erase(queue.begin());
- for (pair<int, long long> edge : graph[v]) {
- int u = edge.first;
- long long weight = edge.second;
- if (d[v] + weight < d[u]) {
- queue.erase({d[u], u});
- d[u] = d[v] + weight;
- queue.insert({d[u], u});
- }
- }
- }
- for (int price : d) {
- initial_price += price;
- }
- graph[s] = copy_edges_from_s;
- return initial_price;
- }
- int main() {
- int n, k;
- cin >> n;
- vector<long long> station_prices;
- for (int i = 0; i < n; ++i) {
- long long price;
- cin >> price;
- station_prices.push_back(price);
- }
- cin >> k;
- vector<vector<pair<int, long long>>> graph;
- graph.resize(n);
- for (int i = 0; i < k; ++i) {
- int first, second, price;
- cin >> first >> second >> price;
- --first, --second;
- graph[first].emplace_back(second, price);
- graph[second].emplace_back(first, price);
- }
- long long ans = dijkstra(0, n, station_prices, graph);
- for (int v = 1; v < n; ++v) {
- ans = min(ans, dijkstra(v, n, station_prices, graph));
- }
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement