Pagini recente » Cod sursa (job #2499843) | Cod sursa (job #245857) | Cod sursa (job #739418) | Cod sursa (job #847894) | Cod sursa (job #2519945)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int n, m, k, a, b, x, sol, ii;
int ubu[20];
int d[20][2005], D[20][(1<<16)];
set <pair<int, int> > s;
vector <pair<int, int> > L[2005];
void dijkstra (int nod, int d[]){
s.clear();
s.insert ({0, nod});
for (int i=1; i<=n; i++){
d[i] = INT_MAX;
}
d[nod] = 0;
while (s.size()){
int costnod = s.begin()->first;
int nod = s.begin()->second;
s.erase (s.begin());
for (int i=0; i<L[nod].size(); i++){
int vecin = L[nod][i].first;
int costvecin = L[nod][i].second;
if (d[vecin] > costnod + costvecin){
s.erase ({d[vecin], vecin});
d[vecin] = costnod + costvecin;
s.insert ({d[vecin], vecin});
}
}
}
}
int main(){
sol = INT_MAX;
fin >> n >> m >> k;
for (int i=1; i<=k; i++){
fin >> ubu[i];
}
for (int i=1; i<=m; i++){
fin >> a >> b >> x;
L[a].push_back ({b, x});
L[b].push_back ({a, x});
}
if (k == 0){
dijkstra(1, d[0]);
fout << d[0][n];
return 0;
}
dijkstra (1, d[0]);
for (int i=1; i<=k; i++){
dijkstra (ubu[i], d[i]);
}
for (int i=1; i<=k; i++){
for (int j=0; j<(1<<k); j++){
D[i][j] = INT_MAX;
}
D[i][(1<<(i-1))] = d[0][ubu[i]];
}
for (int i=1; i<(1<<k); i++){
for (int j=1; j<=k; j++){
if (D[j][i] != INT_MAX){
for (int p=1; p<=k; p++){
if(!((i>>(p-1))&1)){
ii = i;
ii |= (1<<(p-1));
D[p][ii] = min (D[p][ii], D[j][i] + d[j][ubu[p]]);
}
}
}
}
}
for(int i=1; i<=k; i++){
sol = min (sol, D[i][(1<<k)-1] + d[i][n]);
}
fout << sol;
return 0;
}
//masca de biti ca sa stiu nodurile prin care am trecut