Pagini recente » Cod sursa (job #29362) | Cod sursa (job #3293483) | Cod sursa (job #3267582) | Cod sursa (job #3283955) | Cod sursa (job #2794451)
#include <bits/stdc++.h>
#define per pair<int,int>
#define inf 1e9 + 5
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int kmax = 17;
const int nmax = 2e3 + 5;
int n, m, k;
int tr[kmax], dist[nmax][nmax], dr[nmax], dp[1 << kmax][kmax];
vector <per> v[nmax];
priority_queue <per, vector<per>, greater<per>> pq;
void read(){
fin >> n >> m >> k;
for(int i = 1; i <= k; i++)
fin >> tr[i];
tr[0] = 1;
tr[k + 1] = n;
for(int i = 1; i <= m; i++){
int x, y, c;
fin >> x >> y >> c;
v[x].push_back({y, c});
v[y].push_back({x, c});
}
}
void dijkstra(int pr){
for(int i = 1; i <= n; i++)
dr[i] = inf;
pq.push({0, pr});
dr[pr] = 0;
while(!pq.empty()){
per x = pq.top();
pq.pop();
for(auto y: v[x.second])
if(dr[y.first] > dr[x.second] + y.second){
dr[y.first] = dr[x.second] + y.second;
pq.push({dr[y.first], y.first});
}
}
}
void init(){
for(int i = 0; i <= k + 1; i++){
dijkstra(tr[i]);
for(int j = 0; j <= k + 1; j++)
dist[i][j] = dist[j][i] = dr[tr[j]];
dist[i][i] = inf;
}
}
void solve(){
for(int i = 0; i < (1 << (k + 2)); i++)
for(int j = 0; j <= k + 1; j++)
dp[i][j] = inf;
dp[0][0] = dist[0][0] = 0;
for(int i = 0; i < (1 << (k + 2)); i++)
for(int j = 0; j <= k + 1; j++)
if(i & (1 << j))
for(int l = 0; l <= k + 1; l++)
dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][l] + dist[j][l]);
fout << dp[(1 << (k + 2)) - 1][k + 1];
}
int main()
{
read();
init();
solve();
return 0;
}