Pagini recente » Cod sursa (job #351311) | Cod sursa (job #2121921) | Cod sursa (job #39244) | Cod sursa (job #2450033) | Cod sursa (job #2112202)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
const int kmax = 15, f_mare = 1e9, nmax = 2005;
struct edge {
int y, c;
};
vector<edge> ls[nmax];
int n, m, k, i, j, x, y, c;
int cost[kmax+5][nmax];
int co[nmax];
int *interzis = new int;
int sol[(1<<kmax)+5][kmax], v[kmax+5];
bool fol[nmax];
void bfs(int x, int *c) {
queue <int> coada;
int i;
for (i = 1; i <= n; i++)
co[i] = f_mare;
co[x] = 0;
coada.push(x);
while (coada.empty() == 0) {
x = coada.front();
coada.pop();
fol[x] = 0;
for (auto it : ls[x]) {
int y = it.y;
if (co[x] + it.c < co[y]) {
co[y] = co[x]+it.c;
if (fol[y]) continue;
fol[y] = 1;
coada.push(y);
}
}
}
if (c == interzis)
return;
for (i = 1; i <= n; i++)
c[i] = co[i];
}
int hamilton() {
int i, j, w;
for (i = 1; i < (1 << k); i++)
for (j = 0; j < k; j++)
sol[i][j] = f_mare;
bfs(1, interzis);
for (i = 0; i < k; i++)
sol[(1<<i)][i] = co[v[i]];
for (i = 1; i < (1 << k); i++)
for (j = 0; j < k; j++)
if ( (i & (1<<j)) !=0) {
for (w = 0; w < k; w++)
if ( (i & (1<<w)) != 0 && w != j)
if (sol[i][j] > sol[i^(1<<j)][w] + cost[w][v[j]])
sol[i][j] = sol[i^(1<<j)][w] + cost[w][v[j]];
}
int minim = f_mare;
for (i = 0; i < k; i++) {
if (sol[(1<<k)-1][i] + cost[i][n] < minim)
minim = sol[(1<<k)-1][i] + cost[i][n];
}
return minim;
}
int main() {
f >> n >> m >> k;
for (i = 0; i < k; i++) {
f >> v[i];
}
while (m--) {
f >> x >> y >> c;
ls[x].push_back({y,c});
ls[y].push_back({x,c});
}
for (i = 0; i < k; i++)
bfs(v[i], cost[i]);
g << hamilton();
}