Pagini recente » Cod sursa (job #2343535) | Cod sursa (job #1794693) | Cod sursa (job #2536549) | Cod sursa (job #1540626) | Cod sursa (job #1734392)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
const unsigned f_mare = 2e+9;
unsigned n, m, k, c[2005];
unsigned minim = f_mare, i, j, x, y, C, I;
vector <unsigned> ls[2005], lc[2005];
unsigned mat[18000][20];
queue <unsigned> nod;
unsigned dist[2005][2005];
void bf(int K) {
int x, y, c, l, i;
unsigned distantza[2005];
for (i = 1; i <= n; i++)
distantza[i] = f_mare;
distantza[K] = 0;
nod.push(K);
while (nod.empty() == 0) {
x = nod.front();
nod.pop();
l = ls[x].size();
for (i = 0; i < l; i++) {
y = ls[x][i];
c = lc[x][i];
if (distantza[x] + c < distantza[y]) {
distantza[y] = distantza[x]+c;
nod.push(y);
}
}
}
for (i = 1; i <= n; i++)
dist[K][i] = dist[i][K] = distantza[i];
}
int main() {
f >> n >> m >> k;
for (i = 0; i < k; i++)
f >> c[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);
}
for (i = 1; i <= k; i++)
bf(c[i-1]);
for (i = 1; i < (1 << k); i++)
for (j = 0; j < k; j++)
mat[i][j] = f_mare;
for (i = 0; i < k; i++)
mat[(1 << i)][i] = dist[1][c[i]];
if (k > 1) {
for (i = 1; i < (1 << k); i++)
for (j = 0; j < k; j++)
if (i & (1 << j)) {
for (I = 0; I < k; I++)
if (I != j && (i & (1 << I)))
mat[i][j] = min(mat[i][j], mat[i^(1 << j)][I] + dist[c[I]][c[j]]);
}
}
for (i = 0; i < k; i++)
if (mat[(1<<k)-1][i] + dist[c[i]][n] < minim)
minim = mat[(1<<k)-1][i] + dist[c[i]][n];
g << minim;
return 0;
}