Cod sursa(job #3197799)

Utilizator divadddDavid Curca divaddd Data 27 ianuarie 2024 14:50:28
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <bits/stdc++.h>
#define pii pair<int, int>
#define tii tuple<int, int, int>
using namespace std;
const int INF = 0x3f3f3f3f;
const int KMAX = 18;
const int NMAX = 2002;
int n,m,k,x,y,z,c[NMAX],dist[KMAX][KMAX],id[NMAX],aux[NMAX],dp[(1<<KMAX)][KMAX];
vector<pii> v[NMAX];

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

void minSelf(int &a, int b){
    a = min(a, b);
}

void dijkstra(int st, int idx){
    memset(aux, INF, sizeof(aux));
    set<pii> s;
    aux[st] = 0;
    s.insert({0, st});
    while(!s.empty()){
        auto [cost, nod] = *s.begin();
        s.erase(s.begin());
        for(auto [fiu, val]: v[nod]){
            if(aux[fiu] > cost+val){
                aux[fiu] = cost+val;
                s.insert({aux[fiu], fiu});
            }
        }
    }
    for(int i = 1; i <= k; i++){
        dist[idx][i] = aux[c[i]];
    }
}

int main()
{
    fin >> n >> m;
    fin >> k; ++k;
    c[1] = 1;
    for(int i = 2; i <= k; i++){
        fin >> c[i];
    }
    c[++k] = n;
    for(int i = 1; i <= k; i++){
        id[c[i]] = i;
    }
    for(int i = 1; i <= m; i++){
        fin >> x >> y >> z;
        v[x].push_back({y, z});
        v[y].push_back({x, z});
    }
    for(int i = 1; i <= k; i++){
        dijkstra(c[i], i);
    }
    memset(dp, INF, sizeof(dp));
    dp[1][1] = 0;
    for(int mask = 0; mask < (1<<k); mask++){
        for(int lst = 1; lst <= k; lst++){
            if(!((mask>>(lst-1))&1)){
                continue;
            }
            for(int nw = 1; nw <= k; nw++){
                if((mask>>(nw-1))&1){
                    continue;
                }
                int newmask = mask|(1<<(nw-1));
                minSelf(dp[newmask][nw], dp[mask][lst]+dist[lst][nw]);
            }
        }
    }
    fout << dp[(1<<k)-1][k];
    return 0;
}