Pagini recente » Cod sursa (job #748080) | Cod sursa (job #2428249) | Cod sursa (job #1769157) | Cod sursa (job #157542) | Cod sursa (job #1734427)
#include <fstream>
#include <queue>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
const unsigned f_mare = 3.5e+9;
unsigned n, m, k, c[2005];
unsigned minim = f_mare, i, j, x[10005], y[10005], C[10005], I;
unsigned mat[18000][20];
queue <unsigned> nod;
unsigned dist[2005][2005];
void dijkstra(int K) {
int i;
bool ok;
unsigned distantza[2005];
for (i = 1; i <= n; i++)
distantza[i] = f_mare;
distantza[K] = 0;
ok = 1;
while (ok) {
ok = 0;
for (i = 1; i <= m; i++) {
if (distantza[x[i]] < f_mare){
if (distantza[x[i]] + C[i] < distantza[y[i]] && y[i] != K)
ok = 1, distantza[y[i]] = distantza[x[i]] + C[i];
}
if (distantza[y[i]] < f_mare) {
if (distantza[y[i]] + C[i] < distantza[x[i]] && x[i] != K)
ok = 1, distantza[x[i]] = distantza[y[i]] + C[i];
}
}
}
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[i] >> y[i] >> C[i];
if (k > 0) {
for (i = 0; i < k; i++)
dijkstra(c[i]);
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]];
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;
}
else {
dijkstra(n);
g << dist[1][n];
}
return 0;
}