Cod sursa(job #2243164)

Utilizator vjudge101Albert Lin vjudge101 Data 20 septembrie 2018 00:35:54
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 1000000000

using namespace std;

int n;
vector<pair<int, int> > adj[2000];
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 < (int) 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, k; fin >> n >> m >> k;
    int c[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);
    if (k == 0) {
        fout << dist[0][n - 1];
        return 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) continue;
            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;
}