Pagini recente » Cod sursa (job #491457) | Cod sursa (job #495331) | Cod sursa (job #1050438) | Cod sursa (job #1616515) | Cod sursa (job #832648)
Cod sursa(job #832648)
#include <set>
#include <vector>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define MAXN 2100
#define MAXK 16
#define mp make_pair
#define inf 0x3f3f3f3f
int N, K, M, dist[MAXN][MAXN], pd[1 << MAXK][MAXK];
vector<int> nodes;
vector<pair<int, int> > g[MAXN];
void dijkstra(int nod, vector<int> &di) {
set <pair<int, int> > s;
s.insert(mp(0, nod));
di.resize(N, inf);
di[nod] = 0;
while (!s.empty()) {
int nodulet = (*s.begin()).second;
s.erase(s.begin());
for (int i = 0; i < g[nodulet].size(); ++i) {
if (di[g[nodulet][i].first] > di[nodulet] + g[nodulet][i].second) {
s.erase(mp(di[g[nodulet][i].first], g[nodulet][i].first));
di[g[nodulet][i].first] = di[nodulet] + g[nodulet][i].second;
s.insert(mp(di[g[nodulet][i].first], g[nodulet][i].first));
}
}
}
}
int main() {
fin >> N >> M >> K;
for (int i = 1; i <= K; ++i) {
int x;
fin >> x; --x;
nodes.push_back(x);
}
nodes.push_back(N - 1);
nodes.push_back(0);
K += 2;
for (int i = 1; i <= M; ++i) {
int x, y, z;
fin >> x >> y >> z; --x; --y;
g[x].push_back(mp(y, z));
g[y].push_back(mp(x, z));
}
for (int i = 0; i < K; ++i) {
vector<int> di;
dijkstra(nodes[i], di);
for (int j = 0; j < K; ++j)
dist[i][j] = di[nodes[j]];
}
memset(pd, inf, sizeof(pd));
for (int i = 0; i < K - 1; ++i)
pd[1 << i][i] = dist[K - 1][i];
for (int i = 0; i < (1 << (K - 1)); ++i)
for (int j = 0; j < K - 1; ++j)
if (pd[i][j] != inf)
for (int t = 0; t < K - 1; ++t)
if ((1 << t) & (~i))
pd[i | (1 << t)][t] = min(pd[i | (1 << t)][t], pd[i][j] + dist[j][t]);
fout << pd[(1 << (K - 1)) - 1][K - 2];
return 0;
}