Pagini recente » Cod sursa (job #3240460) | Cod sursa (job #2815158) | Cod sursa (job #826880) | Cod sursa (job #1145287) | Cod sursa (job #2949137)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
long long n, m;
long long k;
long long destinatii[20];
long long dist[20][2004];
vector<pair<long long, long long>> adj[2004];
priority_queue<pair<long long, long long>> Q;
long long dp[20][(1 << 15) + 4];
long long rez = LLONG_MAX;
void dijkstra(int sursa, int nod)
{
dist[sursa][nod] = 0;
Q.push({0, nod});
while (!Q.empty())
{
int v = Q.top().second;
long long dist_v = -Q.top().first;
Q.pop();
if (dist_v != dist[sursa][v])
{
continue;
}
for (pair<long long, long long> edge : adj[v])
{
long long u = edge.first;
long long cost = edge.second;
if (dist[sursa][v] + cost < dist[sursa][u])
{
dist[sursa][u] = dist[sursa][v] + cost;
Q.push({-dist[sursa][u], u});
}
}
}
}
int main()
{
fin >> n >> m >> k;
for (int i = 1; i <= k; i++)
{
fin >> destinatii[i];
}
for (int i = 1; i <= m; i++)
{
long long a, b, c;
fin >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
if (k == 0)
{
for (int i = 1; i <= n; i++)
{
dist[0][i] = LONG_MAX;
}
dijkstra(0, 1);
fout << dist[0][n];
return 0;
}
for (int i = 0; i < k; i++)
{
for (int j = 1; j <= n; j++)
{
dist[i][j] = LONG_MAX;
}
}
for (int i = 0; i < k; i++)
{
dijkstra(i, destinatii[i + 1]);
}
for (int conf = 0; conf < (1 << k); conf++)
{
for (int i = 0; i < k; i++)
{
dp[i][conf] = LONG_MAX;
}
}
for (int i = 0; i < k; i++)
{
dp[i][(1 << i)] = dist[i][1];
}
for (int conf = 0; conf < (1 << k); conf++)
{
for (int i = 0; i < k; i++)
{
if (conf & (1 << i))
{
for (int j = 0; j < k; j++)
{
if ((i == j) || (conf & (1 << j) == 0))
{
continue;
}
dp[i][conf] = min(dp[i][conf], dp[j][conf ^ (1 << i)] + dist[i][destinatii[j + 1]]);
}
}
}
}
for (int i = 0; i < k; i++)
{
rez = min(rez, dp[i][(1 << k) - 1] + dist[i][n]);
}
fout << rez;
return 0;
}