Pagini recente » Cod sursa (job #1036079) | Cod sursa (job #1290355) | Cod sursa (job #848192) | Cod sursa (job #926579) | Cod sursa (job #2183548)
#include <bits/stdc++.h>
using namespace std;
ifstream f("gather.in");
ofstream g("gather.out");
int n, m, k, dist[16][16][16], tdist[751], cell[16];
unsigned int d[1 << 15][16];
struct miau{int node, cost, lim;};
vector<miau> gr[755];
void Dijkstra(int start, int nr) {
memset(tdist, 0, sizeof tdist);
priority_queue<pair<int, int> > pq;
pq.push({-1, start});
while (!pq.empty()) {
int node = pq.top().second;
if (!tdist[node]) {
tdist[node] = -pq.top().first;
for (auto son: gr[node])
if (!tdist[son.node] && son.lim >= nr)
pq.push({-tdist[node] - son.cost, son.node});
}
pq.pop();
}
}
int main()
{
f >> k >> n >> m;
for (int i = 0; i < k; ++i) f >> cell[i];
for (int i = 1; i <= m; ++i) {
int a, b, c, d;
f >> a >> b >> c >> d;
gr[a].push_back({b, c, d});
gr[b].push_back({a, c, d});
}
for (int i = 0; i < k; ++i)
for (int p = 1; p <= k; ++p) {
Dijkstra(cell[i], p);
for (int j = 0; j < k; ++j) dist[i][j][p] = tdist[cell[j]];
}
Dijkstra(1, 0);
for (int i = 0; i < k; ++i) d[(1 << i)][i] = tdist[cell[i]] - 1;
for (int mask = 1; mask < (1 << k); ++mask) {
if (__builtin_popcount(mask) == 1) {
continue;
}
for (int p = 0; p < k; ++p) if (mask & (1 << p)) {
d[mask][p] = (unsigned int)1 << 31;
int pm = mask - (1 << p);
int cnt = 0;
for (int q = 0; q < k; ++q) if (pm & (1 << q)) ++cnt;
for (int q = 0; q < k; ++q) if (pm & (1 << q)) d[mask][p] = min(d[mask][p], d[pm][q] + (dist[p][q][cnt] - 1) * (cnt + 1));
}
}
unsigned int mini = (unsigned int)1 << 31;
for (int i = 0; i < k; ++i) mini = min(mini, d[(1 << k) - 1][i]);
g << mini << '\n';
return 0;
}