Pagini recente » Cod sursa (job #2186865) | Cod sursa (job #2438336) | Cod sursa (job #1362916) | Cod sursa (job #413997) | Cod sursa (job #1893008)
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
const int f_mare = 1000000005;
vector <int> ls[2005], lc[2005];
int dist[20][2005], n,m,x,y,c,i, j, w,K,cb[20];
int sol[33000][2005];
void bf(int k) {
int i, l, y;
x = cb[k];
queue <int> q;
q.push(x);
for (i = 1; i <= n; i++)
dist[k][i] = f_mare;
dist[k][x] = 0;
while (q.empty() == 0) {
x = q.front();
l = ls[x].size();
q.pop();
for (i = 0; i < l; i++) {
y = ls[x][i];
if (dist[k][x] + lc[x][i] < dist[k][y]) {
dist[k][y] = dist[k][x]+lc[x][i];
q.push(y);
}
}
}
}
int main() {
f >> n >> m >> K;
for (i = 0; i < K; i++)
f >> cb[i];
for (i = 1; i <=m; i++) {
f >> x >> y >> c;
ls[x].push_back(y);
lc[x].push_back(c);
ls[y].push_back(x);
lc[y].push_back(c);
}
if (K == 0) {
cb[1] = 1;
bf(1);
g << dist[1][n];
}
else {
for (i = 0; i < K; i++)
bf(i);
for (i = 0; i <= (1<<K);i++)
for (j= 0;j<=n; j++)
sol[i][j] = f_mare;
for (i = 0; i < K; i++)
sol[(1<<i)][cb[i]] = dist[i][1];
for (i = 1; i < (1<<K); i++) {
for (j = 0; j < K; j++)
if ((i&(1<<j))) {
for (w = 0; w < K; w++)
if (w != j && (i&(1<<w)))
sol[i][j] = min(sol[i][j], sol[i^(1<<j)][w]+dist[w][cb[j]]);
}
}
int minim = f_mare;
for (i = 0; i < K; i++)
minim = min(minim, sol[(1<<K)-1][cb[i]]+dist[i][n]);
g<<minim;
}
return 0;
}