Pagini recente » Cod sursa (job #2147339) | Cod sursa (job #1483491) | Cod sursa (job #1818994) | Cod sursa (job #889737) | Cod sursa (job #2215403)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2005;
const int maxm = 10005;
const int maxconf = 5 + (1 << 16);
int n, m, k;
int c[20];
vector <pair <int, int> > v[maxn];
int dp[maxconf][16];
int q[maxn], st, dr;
int drum[maxn][maxn];
bool viz[maxn];
inline void belfor(int sursa) {
st = dr = 1;
q[1] = sursa;
memset(viz, 0, sizeof viz);
memset(drum[sursa], 0x3f3f3f3f, sizeof drum[sursa]);
drum[sursa][sursa] = 0;
while(st <= dr) {
int nod = q[st];
st++;
viz[nod] = 1;
for(auto x1 : v[nod]) {
int x = x1.first;
drum[sursa][x] = min(drum[sursa][x], drum[sursa][nod] + x1.second);
if(!viz[x]) {
q[++dr] = x;
}
}
}
}
int main() {
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
scanf("%d%d%d", &n, &m, &k);
for(int i = 1;i <= k;i++) {
scanf("%d", &c[i]);
}
for(int i = 1;i <= m;i++) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
v[x].push_back({y, z});
v[y].push_back({x, z});
}
belfor(1);
for(int i = 1;i <= k;i++) {
belfor(c[i]);
}
memset(dp, 0x3f3f3f3f, sizeof dp);
for(int i = 1;i <= k;i++)
dp[1 << (i - 1)][i] = drum[1][c[i]];
int CONF = 1 << (k);
for(int conf = 0;conf < (CONF);conf++)
for(int i = 1;i <= k;i++) {
if(conf & (1 << (i - 1))) {
for(int j = 1;j <= k;j++) {
if(i != j)
if(conf & (1 << (j - 1))) {
dp[conf][i] = min(dp[conf][i], dp[conf ^ (1 << (j - 1))][j] + drum[c[j]][c[i]]);
}
}
}
}
// cerr << dp[CONF - 1][4];
int ans = INT_MAX;
for(int i = 1;i <= k;i++) {
ans = min(ans, dp[CONF - 1][i] + drum[c[i]][n]);
}
cout << ans;
return 0;
}