Pagini recente » Cod sursa (job #751383) | Istoria paginii runda/againfminostress/clasament | Cod sursa (job #552021) | Cod sursa (job #292836) | Cod sursa (job #2071938)
#include <bits/stdc++.h>
using namespace std;
struct at {
int fi, se;
bool operator < (const at &a) const {
return se > a.se;
}
};
const int maxn = 2e4 + 5;
const int inf = 1e9;
int N, M, K;
int v[20];
vector <at> g[maxn];
int d[maxn][maxn];
priority_queue <at> q;
inline void dijkstra(int sursa) {
q.push({sursa, 0});
for(int i = 1;i <= N;i++)
d[sursa][i] = inf;
while(!q.empty()) {
at nod = q.top();
q.pop();
if(d[sursa][nod.fi] == inf) {
d[sursa][nod.fi] = nod.se;
for(auto &x : g[nod.fi]) {
if(d[sursa][x.fi] == inf) {
q.push({x.fi, x.se + nod.se});
}
}
}
}
}
int dp[20][20];
inline void hamilton() {
}
int main() {
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
cin >> N >> M >> K;
for(int i = 0;i < K;i++)
cin >> v[i];
for(int i = 1;i <= M;i++) {
int x, y, z;
cin >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
dijkstra(1);
if(K == 0) {
cout << d[1][N];
return 0;
}
for(int i = 0;i < K;i++) {
dijkstra(v[i]);
}
for(int i = 1;i < (1 << K);i++)
for(int j = 0;j < K;j++)
dp[i][j] = inf;
for(int i = 0;i < K;i++)
dp[(1 << i)][i] = d[1][v[i]];
for(int i = 1;i < (1 << K);i++) {
for(int j = 0;j < K;j++) if(i & (1 << j)) {
for(int l = 0;l < K;l++) {
if(j != l) {
if(i & (1 << l))
dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][l] + d[v[l]][v[j]]);
}
}
}
}
int ans = inf;
for(int i = 0;i < K;i++)
ans = min(ans, dp[(1 << K) - 1][i] + d[v[i]][N]);
cout << ans;
return 0;
}