Pagini recente » Cod sursa (job #2521907) | Cod sursa (job #1094285) | Cod sursa (job #66545) | Monitorul de evaluare | Cod sursa (job #1734441)
#include <fstream>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
const int f_mare = 2e+9;
int n, m, k, c[2005];
int minim = f_mare, i, j, x[10005], y[10005], C[10005], I;
int mat[35000][30];
int distantza[2005];
int V[20];
void dijkstra(int K, int dist[][2005]) {
int i;
bool ok;
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];
}
}
}
if (k > 0)
for (i = 1; i <= n; i++)
dist[V[K]][i] = distantza[i];
else
for (i = 1; i <= n; i++)
dist[1][i] = distantza[i];
}
int main() {
f >> n >> m >> k;
for (i = 0; i < k; i++) {
f >> c[i];
V[c[i]] = i;
}
for (i = 1; i <= m; i++)
f >> x[i] >> y[i] >> C[i];
if (k > 0) {
int dist[30][2005];
for (i = 0; i < k; i++)
dijkstra(c[i], dist);
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[i][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[I][c[j]]);
}
for (i = 0; i < k; i++)
if (mat[(1<<k)-1][i] + dist[i][n] < minim)
minim = mat[(1<<k)-1][i] + dist[i][n];
g << minim;
}
else {
int dist[2][2005];
dijkstra(n, dist);
g << dist[1][1];
}
return 0;
}