Pagini recente » Cod sursa (job #2598637) | Cod sursa (job #600068) | Cod sursa (job #655968) | Cod sursa (job #1186090) | Cod sursa (job #1366841)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin ("gather.in");
ofstream fout ("gather.out");
const int N = 755, P = 16, oo = 2e9;
priority_queue <pair <int, pair <int, int> >, vector <pair <int, pair <int, int> > >, greater <pair <int, pair <int, int> > > > H;
int d[N][1 << P], n, m, k, det[N], nr[1 << P];
vector <pair <int, pair <int, int> > > g[N];
int main() {
fin >> k >> n >> m;
for (int x, i = 0; i < k; ++i) {
fin >> x;
det[x] = 1 << i;
}
for (int i = 1; i <= n; ++i)
for (int j = 0; j < (1 << k); ++j)
d[i][j] = oo;
for (int x, y, mx, c; m; --m) {
fin >> x >> y >> c >> mx;
g[x].push_back(make_pair (y, make_pair(c, mx)));
g[y].push_back(make_pair (x, make_pair(c, mx)));
}
for (int i = 1; i < (1 << k); ++i)
for (int j = 0; j < k; ++j)
if (i & (1 << j))
nr[i]++;
d[1][0] = 0;
H.push(make_pair (0, make_pair(1, 0)));
while (H.size()) {
int x = H.top().second.first, crt = H.top().first, dt = H.top().second.second;
H.pop();
if (nr[dt] == k) {
fout << crt << "\n";
return 0;
}
if (crt > d[x][dt])
continue;
for (vector <pair <int, pair <int, int> > > :: iterator it = g[x].begin(); it != g[x].end(); ++it)
if (nr[dt] <= it -> second.second) {
if (crt + it -> second.first * (nr[dt] + 1) < d[it -> first][dt]) {
d[it -> first][dt] = crt + it ->second.first * (nr[dt] + 1);
H.push(make_pair (d[it -> first][dt ], make_pair (it -> first, (dt))));
}
if (det[it -> first] && crt + it -> second.first * (nr[dt] + 1) < d[it -> first][dt | det[it -> first]]) {
d[it -> first][dt | det[it -> first]] = crt + it ->second.first * (nr[dt] + 1);
H.push(make_pair (d[it -> first][dt | det[it -> first]], make_pair (it -> first, (dt | det[it->first]))));
}
}
}
}