Pagini recente » Istoria paginii runda/nostres/clasament | Cod sursa (job #1191904) | Cod sursa (job #454280) | Istoria paginii runda/olivranceanu/clasament | Cod sursa (job #2243155)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 1000000000
using namespace std;
int n;
vector<pair<int, int> > adj[2000];
int c[15 + 2];
int dist[2000][2000];
int dp[1 << 15][15];
void dijkstra(int x) {
for (int i = 0; i < n; i++) dist[x][i] = INF;
priority_queue<pair<int, int> > pq;
pq.push(make_pair(0, x));
dist[x][x] = 0;
while (!pq.empty()) {
pair<int, int> p = pq.top(); pq.pop();
int d = -p.first, y = p.second;
if (dist[x][y] != d) continue;
for (int i = 0; i < adj[y].size(); i++) {
int y2 = adj[y][i].first, d2 = adj[y][i].second + d;
if (dist[x][y2] > d2) {
dist[x][y2] = d2;
pq.push(make_pair(-d2, y2));
}
}
}
}
int main() {
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int m; fin >> n >> m;
int k; fin >> k;
for (int i = 0; i < k; i++) {
fin >> c[i];
c[i]--;
}
for (int i = 0; i < m; i++) {
int x, y, z; fin >> x >> y >> z;
x--; y--;
adj[x].push_back(make_pair(y, z));
adj[y].push_back(make_pair(x, z));
}
dijkstra(0);
for (int i = 0; i < k; i++) dijkstra(c[i]);
for (int i = 0; i < (1 << k); i++) {
for (int j = 0; j < n; j++) dp[i][j] = INF;
}
for (int i = 0; i < k; i++) dp[1 << i][i] = dist[0][c[i]];
for (int i = 1; i < (1 << k); i++) {
for (int j = 0; j < n; j++) {
if (dp[i][j] == INF) break;
for (int kc = 0; kc < k; kc++) {
if (i & (1 << kc)) continue;
dp[i ^ (1 << kc)][kc] = min(dp[i ^ (1 << kc)][kc], dp[i][j] + dist[c[j]][c[kc]]);
}
}
}
int ans = INF;
for (int i = 0; i < k; i++) ans = min(ans, dp[(1 << k) - 1][i] + dist[c[i]][n - 1]);
fout << ans;
return 0;
}