Pagini recente » Cod sursa (job #3333578) | Cod sursa (job #3352180) | Cod sursa (job #3334919) | Cod sursa (job #3324606) | Cod sursa (job #3336605)
#include <bits/stdc++.h>
#define int long long
#define inf (long long)1e18
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
struct state{
int len, cost;
bool operator < (const state & other) const{
return len > other.len;
}
};
int n, m, k, K;
signed main()
{
fin >> n >> m >> k;
K = k + 2;
vector<int> p;
p.push_back(1);
for(int i = 1; i <= k; i++){
int x;
fin >> x, p.push_back(x);
}
p.push_back(n);
vector<vector<pair<int, int>>> adj(n + 1);
for(int i = 1; i <= m; i++){
int a, b, d;
fin >> a >> b >> d;
adj[a].push_back({b, d});
adj[b].push_back({a, d});
}
vector<vector<int>> dist(K, vector<int>(K, inf));
auto dijkstra = [&](int src, vector<int>& d){
priority_queue<state> pq;
d.assign(n + 1, inf);
d[src] = 0;
pq.push({0, src});
while(!pq.empty()){
auto [cd, u] = pq.top();
pq.pop();
if(cd != d[u]) continue;
for(auto [v, w] : adj[u])
if(cd + w < d[v])
d[v] = cd + w, pq.push({d[v], v});
}
};
for(int i = 0; i < K; i++){
vector<int> d;
dijkstra(p[i], d);
for(int j = 0; j < K; j++)
dist[i][j] = d[p[j]];
}
int full = (1 << k);
vector<vector<int>> dp(full, vector<int>(K, inf));
dp[0][0] = 0;
for(int mask = 0; mask < full; mask++)
for(int i = 0; i <= k; i++){
if(dp[mask][i] == inf) continue;
for(int j = 1; j <= k; j++)
if(!(mask & (1 << (j - 1)))){
int newMask = mask | (1 << (j - 1));
dp[newMask][j] = min(dp[newMask][j], dp[mask][i] + dist[i][j]);
}
}
int rez = inf;
for(int i = 0; i <= k; i++)
rez = min(rez, dp[full - 1][i] + dist[i][k + 1]);
fout << rez;
return 0;
}