Pagini recente » Cod sursa (job #3200448) | Cod sursa (job #2105128) | Cod sursa (job #2190769) | Cod sursa (job #1091785) | Cod sursa (job #2641617)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("gather.in");
ofstream cout ("gather.out");
long long dist[20][20][20];
long long dp[1 << 16][16];
long long vc[20];
long long det[20];
long long viz[20];
struct ura{
long long d, ind;
};
ura coada[755];
struct ura2{
long long c, x, nrdet;
};
vector <ura2> lista[755];
long long biti[1 << 16];
int main()
{
int k, n, m, i, j;
cin >> k >> n >> m;
det[0] = 1;
for (i = 1; i <= k; i++)
{
cin >> det[i];
vc[det[i]] = i;
}
for (i = 1; i <= m; i++)
{
int a, b, c, d;
cin >> a >> b >> c >> d;
lista[a].push_back({c, b, d});
lista[b].push_back({c, a, d});
}
for (int tot = 0; tot <= k; tot++)
for (i = 0; i <= k; i++)
{
for (j = 1; j <= k; j++)
{
dist[i][j][tot] = 1e17;
}
for (j = 1; j <= n; j++)
viz[j] = 0;
int inc, sf;
inc = sf = 1;
coada[1].ind = det[i];
dist[i][i][tot] = 0;
viz[det[i]] = 1;
while (inc <= sf)
{
int d = coada[inc].d;
int ind = coada[inc].ind;
for (int h = 0; h < lista[ind].size(); h++)
{
if (viz[lista[ind][h].x] == 0 && lista[ind][h].nrdet >= tot)
{
viz[lista[ind][h].x] = 1;
if (vc[lista[ind][h].x])
dist[i][vc[lista[ind][h].x]][tot] = d + lista[ind][h].c;
coada[++sf].d = d + lista[ind][h].c;
coada[sf].ind = lista[ind][h].x;
}
}
inc++;
}
}
for (i = 1; i < (1 << (k + 1)); i++)
for (j = 0; j < k + 1; j++)
if (i & (1 << j))
{
biti[i] = biti[i ^ (1 << j)] + 1;
j = k + 1;
}
for (i = 1; i < (1 << (k + 1)); i++)
for (j = 0; j <= k; j++)
dp[i][j] = 1e17;
for (j = 1; j <= k; j++)
dp[1 + (1 << j)][j] = dist[0][j][0];
for (i = 3; i < (1 << (k + 1)); i += 2)
for (j = 1; j <= k; j++)
if (i & (1 << j))
for (int h = 1; h <= k; h++)
if (i & (1 << h) && j != h)
dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][h] + dist[h][j][biti[i ^ (1 << j)] - 1] * (biti[i ^ (1 << j)]));
long long sol = 1e17;
/* for (i = 3; i < (1 << (k + 1)); i += 2)
{
for (j = 1; j <= k; j++)
cout << dp[i][j] << " ";
cout << endl;
}*/
for (i = 1; i <= k; i++)
sol = min(sol, dp[(1 << (k + 1)) - 1][i]);
cout << sol;
return 0;
}