Pagini recente » Cod sursa (job #1562575) | Cod sursa (job #266533) | Cod sursa (job #1482583) | Cod sursa (job #775147) | Cod sursa (job #3197799)
#include <bits/stdc++.h>
#define pii pair<int, int>
#define tii tuple<int, int, int>
using namespace std;
const int INF = 0x3f3f3f3f;
const int KMAX = 18;
const int NMAX = 2002;
int n,m,k,x,y,z,c[NMAX],dist[KMAX][KMAX],id[NMAX],aux[NMAX],dp[(1<<KMAX)][KMAX];
vector<pii> v[NMAX];
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
void minSelf(int &a, int b){
a = min(a, b);
}
void dijkstra(int st, int idx){
memset(aux, INF, sizeof(aux));
set<pii> s;
aux[st] = 0;
s.insert({0, st});
while(!s.empty()){
auto [cost, nod] = *s.begin();
s.erase(s.begin());
for(auto [fiu, val]: v[nod]){
if(aux[fiu] > cost+val){
aux[fiu] = cost+val;
s.insert({aux[fiu], fiu});
}
}
}
for(int i = 1; i <= k; i++){
dist[idx][i] = aux[c[i]];
}
}
int main()
{
fin >> n >> m;
fin >> k; ++k;
c[1] = 1;
for(int i = 2; i <= k; i++){
fin >> c[i];
}
c[++k] = n;
for(int i = 1; i <= k; i++){
id[c[i]] = i;
}
for(int i = 1; i <= m; i++){
fin >> x >> y >> z;
v[x].push_back({y, z});
v[y].push_back({x, z});
}
for(int i = 1; i <= k; i++){
dijkstra(c[i], i);
}
memset(dp, INF, sizeof(dp));
dp[1][1] = 0;
for(int mask = 0; mask < (1<<k); mask++){
for(int lst = 1; lst <= k; lst++){
if(!((mask>>(lst-1))&1)){
continue;
}
for(int nw = 1; nw <= k; nw++){
if((mask>>(nw-1))&1){
continue;
}
int newmask = mask|(1<<(nw-1));
minSelf(dp[newmask][nw], dp[mask][lst]+dist[lst][nw]);
}
}
}
fout << dp[(1<<k)-1][k];
return 0;
}