Pagini recente » Cod sursa (job #2977670) | Cod sursa (job #1703888) | Cod sursa (job #1111433) | Cod sursa (job #1902121) | Cod sursa (job #2550839)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int f[502][502];
int n, m, dp[(1 << 17)], dist[2002][2002], k, a[2002], x, y, d, inQ[2002], nod;
vector<pair<int, int> >G[2002];
struct cmp {
bool operator() (const int &a, const int &b) {
return dist[nod][a] > dist[nod][b];
}
};
int mat[500][500];
int mask[(1 << 17)][18];
int main()
{
fin >> n >> m;
fin >> k;
for (int i = 1; i <= k; i++)
fin >> a[i];
for (int i = 1; i <= m; i++) {
fin >> x >> y >> d;
G[x].push_back({y, d});
G[y].push_back({x, d});
}
a[k + 1] = 1;
a[k + 2] = n;
sort(a + 1, a + k + 3);
k += 2;
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= n; j++)
dist[i][j] = -1;
dist[i][a[i]] = 0;
memset(inQ, 0, sizeof(inQ));
inQ[a[i]] = 1;
priority_queue<int, vector<int>, cmp>pq;
pq.push(a[i]);
nod = i;
while (!pq.empty()) {
int x = pq.top();
pq.pop();
inQ[x] = 0;
for (auto it : G[x]) {
if (dist[i][it.first] > dist[i][x] + it.second || dist[i][it.first] == -1) {
dist[i][it.first] = dist[i][x] + it.second;
if (inQ[it.first] == 0) {
inQ[it.first] = 1;
pq.push(it.first);
}
}
}
}
}
for (int i = 0; i < (1 << k); i++)
for (int j = 1; j <= k; j++)
mask[i][j] = 1e9;
mask[1][1] = 0;
for (int i = 1; i < (1 << k); i++) {
if (!(i % 2))
continue;
for (int j = 1; j <= k; j++)
if ((i & (1 << (j - 1))) && mask[i][j] == 1e9 && j != 1) {
int newMask = (i ^ (1 << (j - 1)));
for (int t = 1; t <= k; t++)
if ((newMask & (1 << (t - 1))) && mask[newMask][t] != 1e9)
if (dist[a[t]][a[j]] != -1)
mask[i][j] = min(mask[i][j], dist[t][a[j]] + mask[newMask][t]);
}
}
fout << mask[(1 << k) - 1][k];
return 0;
}