Pagini recente » Cod sursa (job #1257582) | Cod sursa (job #1724209) | Cod sursa (job #1539858) | Cod sursa (job #1833907) | Cod sursa (job #2959174)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
typedef long long ll;
const ll inf = 10000000000000000;
int n, m, nr, p[18];
ll dst[18][18], r[(1 << 17)][18];
vector < vector < pair <int, int> > > g(2001);
vector<ll> d(2001);
int main()
{
fin >> n >> m >> nr;
int i, j, k;
k = 0;
p[k] = 1;
for (i = 1; i <= nr; i++)
{
int x;
fin >> x;
p[++k] = x;
}
p[++k] = n;
nr++;
for (int l = 1; l <= m; l++)
{
fin >> i >> j >> k;
g[i].push_back(make_pair(j, k));
g[j].push_back(make_pair(i, k));
}
for (int l = 0; l < nr; l++)
{
queue<int> Q;
Q.push(p[l]);
for (i = 1; i <= n; i++)
d[i] = inf;
d[p[l]] = 0;
while (!Q.empty())
{
int nod = Q.front();
Q.pop();
for (auto i : g[nod])
if (d[i.first] > d[nod] + i.second)
{
d[i.first] = d[nod] + i.second;
Q.push(i.first);
}
}
if (l == 0)
{
if (nr == 1)
{
fout << d[n];
return 0;
}
}
for (k = l + 1; k <= nr; k++)
dst[l][k] = dst[k][l] = d[p[k]];
}
for (i = 0; i < (1 << (nr + 1)); i++)
for (j = 0; j <= nr; j++)
r[i][j] = inf;
r[0][0] = 0;
for (i = 0; i < (1 << (nr + 1)); i++)
for (j = 0; j <= nr; j++)
if (i & (1 << j))
for (k = 0; k <= nr; k++)
r[i][j] = min(r[i][j], r[i ^ (1 << j)][k] + dst[k][j]);
fout << r[((1 << (nr + 1)) - 1)][nr];
return 0;
}