Pagini recente » Cod sursa (job #1079865) | Cod sursa (job #1760563) | Cod sursa (job #2476625) | Cod sursa (job #1905897) | Cod sursa (job #1296256)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
const int NMAX = 2000 + 1;
const int KMAX = 15 + 1;
const int INF = 0x3fffffff;
int n, m, k;
int distanta[NMAX];
short int special[NMAX];
int distante[KMAX][KMAX + 2];
int best[1 << KMAX][NMAX];
vector < pair <int, int> > graf[NMAX];
queue <short int> Q;
void citeste() {
f >> n >> m >> k;
int a, b, c;
for (int i = 1; i <= k; i++) f >> special[i];
for (int i = 1; i <= m; i++) {
f >> a >> b >> c;
graf[a].push_back(make_pair(b, c));
graf[b].push_back(make_pair(a, c));
}
}
void bellman_ford(int sursa) {
Q.push(sursa);
int nod;
for (int i = 1; i <= n; i++) distanta[i] = INF;
distanta[sursa] = 0;
while (!Q.empty()) {
nod = Q.front();
Q.pop();
for (vector <pair <int ,int> > :: iterator it = graf[nod].begin(); it != graf[nod].end(); it++)
if (distanta[(*it).first] > distanta[nod] + (*it).second) {
distanta[(*it).first] = distanta[nod] + (*it).second;
Q.push((*it).first);
}
}
}
void rezolva() {
int nr_config = 1 << k, config2;
if (!k) {
bellman_ford(1);
g << distanta[n];
return;
}
special[0] = 1;
for (int i = 0; i <= k; i++) {
bellman_ford(special[i]);
for (int j = 0; j <= k; j++)
distante[i][j] = distanta[special[j]];
distante[i][k + 1] = distanta[n];
}
for (int config = 0; config < nr_config; config++)
for (int i = 0; i <= k; i++) best[config][i] = INF;
best[0][0] = 0;
for (int config = 1; config < nr_config; config++) {
for (int i = 0; i < k; i++)
if (config & (1 << i)) {
config2 = config - (1 << i);
for (int j = 0; j <= k; j++)
best[config][i + 1] = min(best[config][i + 1], best[config2][j] + distante[j][i + 1]);
}
}
int sol = INF;
for (int i = 1; i <= k; i++)
sol = min(sol, best[nr_config - 1][i] + distante[i][k + 1]);
g << sol << '\n';
}
int main() {
citeste();
rezolva();
return 0;
}