Pagini recente » Cod sursa (job #876045) | Cod sursa (job #668465) | Cod sursa (job #1786495) | Istoria paginii runda/pregatireoji/clasament | Cod sursa (job #2550797)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int n, m, dp[(1 << 17)], dist[2002][2002], k, a[2002], x, y, d, inQ[2002];
vector<pair<int, int> >G[2002];
struct cmp {
bool operator() (const int &a, const int &b) const {
return dist[a] > dist[b];
}
};
void dijkstra (int x, int dist[]) {
for (int i = 1; i <= n; i++)
dist[i] = -1;
dist[x] = 0;
memset(inQ, 0, sizeof(inQ));
inQ[x] = 1;
priority_queue<int, vector<int>, cmp>pq;
pq.push(x);
while (!pq.empty()) {
int x = pq.top();
pq.pop();
inQ[x] = 0;
for (auto it : G[x]) {
if (dist[it.first] > dist[x] + it.second || dist[it.first] == -1) {
dist[it.first] = dist[x] + it.second;
if (inQ[it.first] == 0) {
inQ[it.first] = 1;
pq.push(it.first);
}
}
}
}
}
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++) {
dijkstra(a[i], dist[i]);
}
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[t][j] != -1)
mask[i][j] = dist[t][a[j]] + mask[newMask][t];
}
}
fout << mask[(1 << k) - 1][k];
return 0;
}