Pagini recente » Cod sursa (job #922474) | Cod sursa (job #661607) | Cod sursa (job #193520) | Cod sursa (job #1116708) | Cod sursa (job #3200639)
#include <bits/stdc++.h>
#define INF 1000000001
#define NMAX 2001
#define KMAX 17
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m, k, x, y, c, nr, sol, v[KMAX], dp[KMAX][1 << KMAX], d[KMAX][NMAX];
bool viz[NMAX];
vector<pair<int, int>> l[NMAX];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
void dijkstra(int poz)
{
for (int i = 1; i <= n; i++)
d[poz][i] = INF;
d[poz][v[poz]] = 0;
pq.push({0, v[poz]});
memset(viz, 0, sizeof(viz));
while (!pq.empty())
{
int nod = pq.top().second;
if (viz[nod] == 1)
{
pq.pop();
continue;
}
viz[nod] = 1;
pq.pop();
for (int i = 0; i < l[nod].size(); i++)
{
int vec = l[nod][i].first;
int c = l[nod][i].second;
if (d[poz][nod] + c < d[poz][vec])
{
d[poz][vec] = d[poz][nod] + c;
pq.push({d[poz][vec], vec});
}
}
}
}
int main()
{
fin >> n >> m >> k;
for (int i = 1; i <= k; i++)
fin >> v[i];
while (m--)
{
fin >> x >> y >> c;
l[x].push_back({y, c});
l[y].push_back({x, c});
}
v[++k] = 1;
for (int i = 1; i <= k; i++)
dijkstra(i);
if (k == 1)
{
fout << d[1][n];
return 0;
}
k--;
int stare_finala = (1 << k) - 1;
for (int i = 1; i <= k; i++)
{
for (int st = 1; st <= stare_finala; st++)
dp[i][st] = INF;
dp[i][1 << (i - 1)] = d[i][1];
}
for (int st = 1; st <= stare_finala; st++)
for (int i = 1; i <= k; i++)
if (dp[i][st] != INF)
for (int j = 1; j <= k; j++)
if (i != j && ((st >> (j - 1)) & 1) == 0)
{
int nxt = st | (1 << (j - 1));
dp[j][nxt] = min(dp[j][nxt], dp[i][st] + d[i][v[j]]);
}
sol = INF;
for (int i = 1; i <= k; i++)
sol = min(sol, dp[i][stare_finala] + d[i][n]);
fout << sol;
return 0;
}