Pagini recente » Cod sursa (job #491245) | Autentificare | Cod sursa (job #661845) | Cod sursa (job #732914) | Cod sursa (job #2854386)
#include <bits/stdc++.h>
using namespace std;
const int oo = 1e9;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m, k;
int dp[20][(1<<15)];
int dist[2005];
int d[25][25];
int viz[2005];
int C[20];
vector< pair<int, int> >V[2005];
void Dijkstra(int x)
{
int i, j;
for(i = 1;i <= n;i++)
dist[i] = oo;
dist[x] = 0;
priority_queue<pair<int, int>>pq;
pq.push({0, x});
while(!pq.empty())
{
int nod = pq.top().second;
pq.pop();
for(auto it : V[nod])
if(dist[it.first] > dist[nod] + it.second)
{
dist[it.first] = dist[nod] + it.second;
pq.push({-dist[it.first], it.first});
}
}
for(i = 0;i <= k + 1;i++)
d[x][C[i]] = dist[C[i]];
}
void Citire()
{
int i, x, y, cost;
fin >> n >> m >> k;
for(i = 1;i <= k;i++)
fin >> C[i];
C[0] = 1;
C[k + 1] = n;
for(i = 1;i <= m;i++)
{
fin >> x >> y >> cost;
V[x].push_back({y, cost});
V[y].push_back({x, cost});
}
}
void Solve()
{
int i, stare, j, masca;
for(i = 0;i <= k + 1;i++)
Dijkstra(C[i]);
int K = (1 << (k + 2)) - 1;
for(stare = 0;stare <= K;stare++)
for(i = 0;i <= k + 1;i++)
dp[i][stare] = oo;
dp[0][1] = 0;
for(stare = 0;stare <= K;stare++)
for(i = 0;i <= k + 1;i++)
if((stare & (1 << i)))
{
for(j = 0;j <= k + 1;j++)
if((stare & (1 << j)) == 0)
{
masca = stare | (1 << j);
dp[j][masca] = min(dp[j][masca], dp[i][stare] + d[C[i]][C[j]]);
}
}
fout << dp[k + 1][K] << "\n";
}
int main()
{
Citire();
Solve();
return 0;
}