Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- long long ans = 1LL << 60;
- int n, m, k;
- vector <int> markets;
- vector <bool> mark;
- vector <vector <pair <int, long long> > > g;
- vector <vector <long long> > dist;
- set <pair <long long, int> > que;
- vector <int> path;
- void dijkstra(int ind) {
- dist[ind][markets[ind]] = 0;
- que.insert({0, markets[ind]});
- for (int i = 0; i < n; ++i) {
- if (i != ind) {
- que.insert({1LL << 60, i});
- }
- }
- while (que.size()) {
- for (auto u : g[que.begin() -> second]) {
- if (dist[ind][u.first] > que.begin() -> first + u.second) {
- que.erase({dist[ind][u.first], u.first});
- dist[ind][u.first] = que.begin() -> first + u.second;
- que.insert({dist[ind][u.first], u.first});
- }
- }
- que.erase(que.begin());
- }
- }
- int main() {
- freopen("relocate.in", "r", stdin);
- freopen("relocate.out", "w", stdout);
- ios::sync_with_stdio(0);
- cin.tie(0);
- cin >> n >> m >> k;
- dist.resize(k, vector <long long> (n, 1LL << 60));
- markets.resize(k);
- mark.resize(n);
- g.resize(n);
- for (int i = 0; i < k; ++i) {
- cin >> markets[i];
- --markets[i];
- mark[markets[i]] = 1;
- }
- for (int i = 0; i < m; ++i) {
- int u, v;
- long long len;
- cin >> u >> v >> len;
- --u;
- --v;
- g[u].push_back({v, len});
- g[v].push_back({u, len});
- }
- for (int i = 0; i < k; ++i) {
- dijkstra(i);
- }
- path.resize(k);
- iota(path.begin(), path.end(), 0);
- do {
- long long have = 1LL << 60;
- for (int i = 0; i < n; ++i) {
- if (!mark[i]) {
- have = min(have, dist[path[0]][i] + dist[path[k - 1]][i]);
- }
- }
- if (have == 1LL << 60) {
- continue;
- }
- for (int i = 1; i < k; ++i) {
- have += dist[path[i]][markets[path[i - 1]]];
- }
- ans = min(ans, have);
- } while (next_permutation(path.begin(), path.end()));
- cout << ans << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement