Pagini recente » Cod sursa (job #2755763) | Cod sursa (job #2909108) | Cod sursa (job #226510) | Cod sursa (job #1537001) | Cod sursa (job #2576270)
#include <fstream>
#include <functional>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int nMax = 2005, oo = 20000000, cmax = 1 << 18;
vector <pair<int, int>> g[nMax], newg[20];
int v[20], n, m, k, dp[nMax], a[20][20], cfg[cmax];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
void Dijkstra(int smth, int ind) {
for (int i = 1; i <= n; i++)
dp[i] = oo;
pq.push({0, smth});
dp[smth] = 0;
while (!pq.empty()) {
int nod = pq.top().second, cost = pq.top().first;
pq.pop();
if (dp[nod] != cost)
continue;
for (auto i : g[nod])
if (dp[nod] + i.second < dp[i.first]) {
dp[i.first] = dp[nod] + i.second;
pq.push({dp[i.first], i.first});
}
}
for (int i = 1; i <= k; i++)
a[ind][i] = dp[v[i]];
}
void Solve() {
int f = 1 << (k - 1);
for (int i = 0; i <= f - 1; i++)
cfg[i] = oo;
cfg[1] = 0;
for (int i = 1; i <= f - 1; i++) {
if (i & 1 == 0)
continue;
for (int j = 2; j < k; j++) {
int ceva = (1 << (j - 1)) & i;
if (ceva != 0) {
for (int p = 1; p < k; p++) {
if ((1 << (p - 1)) & i != 0)
cfg[i] = min(cfg[i], cfg[i - (1 << (j - 1))] + a[j][p]);
}
}
}
}
int ans = oo;
for (int i = 2; i < k; i++)
ans = min(ans, cfg[f - 1] + a[i][k]);
fout << ans << '\n';
}
int main() {
fin >> n >> m;
fin >> k;
for (int i = 2; i <= k + 1; i++)
fin >> v[i];
v[1] = 1;
v[k + 2] = n;
k += 2;
for (int i = 1; i <= m; i++) {
int x, y, z;
fin >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
for (int i = 1; i <= k; i++)
Dijkstra(v[i], i);
Solve();
}