Pagini recente » Cod sursa (job #1251756) | Cod sursa (job #2448812) | Cod sursa (job #1483757) | Cod sursa (job #1506073) | Cod sursa (job #2717048)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int oo = (1 << 16) + 1;
int n, m, k, c[2001], d[2001], dist[20][20], dp[(1 << 18) + 5][18];
bool inCoada[2001];
struct compara {
bool operator()(int a, int b) {
return d[a] > d[b];
}
};
vector < pair < int, int > > G[2001];
priority_queue< int, vector < int >, compara > Q;
void dijkstra(int nod) {
for (int i = 1; i <= n; i++)d[i] = oo;
d[nod] = 0;
Q.push(nod);
inCoada[nod] = true;
while (!Q.empty()) {
int nod_curent = Q.top();
Q.pop();
inCoada[nod_curent] = false;
for (unsigned int i = 0; i < G[nod_curent].size(); i++) {
int vecin = G[nod_curent][i].first;
int cost = G[nod_curent][i].second;
if (d[vecin] > d[nod_curent] + cost) {
d[vecin] = d[nod_curent] + cost;
if (inCoada[vecin] == false) {
inCoada[vecin] = true;
Q.push(vecin);
}
}
}
}
}
int main() {
ios::sync_with_stdio(false);
in.tie(NULL), out.tie(NULL);
in >> n >> m >> k;
for (int i = 1; i <= k; i++) in >> c[i];
for (int i = 1; i <= m; i++) {
int x, y, c;
in >> x >> y >> c;
G[x].push_back(make_pair(y, c));
G[y].push_back(make_pair(x, c));
}
c[0] = 1, c[k + 1] = n;
for (int i = 0; i <= k + 1; i++) {
dijkstra(c[i]);
for (int j = 0; j <= k + 1; j++) dist[i][j] = d[c[j]];
if (i) dist[i][i] = oo;
}
int doilakplus2 = (1 << (k + 2));
for (int i = 0; i < doilakplus2; i++) {
for (int j = 0; j <= k + 1; j++) {
dp[i][j] = oo;
}
}
dp[0][0] = 0;
for (int i = 0; i < doilakplus2; i++) {
for (int j = 0; j <= k + 1; j++) {
if (i & (1 << j)) {
for (int l = 0; l <= k + 1; l++) {
dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][l] + dist[l][j]);
}
}
}
}
out << dp[(1 << k + 2) - 1][k + 1];
return 0;
}