Cod sursa(job #2794451)

Utilizator As932Stanciu Andreea As932 Data 4 noiembrie 2021 21:53:46
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <bits/stdc++.h>
#define per pair<int,int>
#define inf 1e9 + 5

using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

const int kmax = 17;
const int nmax = 2e3 + 5;

int n, m, k;
int tr[kmax], dist[nmax][nmax], dr[nmax], dp[1 << kmax][kmax];
vector <per> v[nmax];
priority_queue <per, vector<per>, greater<per>> pq;

void read(){
    fin >> n >> m >> k;

    for(int i = 1; i <= k; i++)
        fin >> tr[i];

    tr[0] = 1;
    tr[k + 1] = n;

    for(int i = 1; i <= m; i++){
        int x, y, c;
        fin >> x >> y >> c;
        v[x].push_back({y, c});
        v[y].push_back({x, c});
    }
}

void dijkstra(int pr){
    for(int i = 1; i <= n; i++)
        dr[i] = inf;

    pq.push({0, pr});
    dr[pr] = 0;

    while(!pq.empty()){
        per x = pq.top();
        pq.pop();

        for(auto y: v[x.second])
        if(dr[y.first] > dr[x.second] + y.second){
            dr[y.first] = dr[x.second] + y.second;
            pq.push({dr[y.first], y.first});
        }
    }
}

void init(){
    for(int i = 0; i <= k + 1; i++){
        dijkstra(tr[i]);

        for(int j = 0; j <= k + 1; j++)
            dist[i][j] = dist[j][i] = dr[tr[j]];
        dist[i][i] = inf;
    }
}

void solve(){
    for(int i = 0; i < (1 << (k + 2)); i++)
        for(int j = 0; j <= k + 1; j++)
            dp[i][j] = inf;

    dp[0][0] = dist[0][0] = 0;
    for(int i = 0; i < (1 << (k + 2)); 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[j][l]);

    fout << dp[(1 << (k + 2)) - 1][k + 1];
}

int main()
{
    read();
    init();
    solve();

    return 0;
}