Cod sursa(job #2519945)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 8 ianuarie 2020 18:04:15
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, k, a, b, x, sol, ii;
int ubu[20];
int d[20][2005], D[20][(1<<16)];

set <pair<int, int> > s;

vector <pair<int, int> > L[2005];

void dijkstra (int nod, int d[]){
    s.clear();
    s.insert ({0, nod});
    for (int i=1; i<=n; i++){
        d[i] = INT_MAX;
    }
    d[nod] = 0;
    while (s.size()){
        int costnod = s.begin()->first;
        int nod     = s.begin()->second;
        s.erase (s.begin());
        for (int i=0; i<L[nod].size(); i++){
            int vecin     = L[nod][i].first;
            int costvecin = L[nod][i].second;
            if (d[vecin] > costnod + costvecin){
                s.erase ({d[vecin], vecin});
                d[vecin] = costnod + costvecin;
                s.insert ({d[vecin], vecin});
            }
        }
    }
}

int main(){
    sol = INT_MAX;
    fin >> n >> m >> k;
    for (int i=1; i<=k; i++){
        fin >> ubu[i];
    }
    for (int i=1; i<=m; i++){
        fin >> a >> b >> x;
        L[a].push_back ({b, x});
        L[b].push_back ({a, x});
    }
    if (k == 0){
        dijkstra(1, d[0]);
        fout << d[0][n];
        return 0;
    }
    dijkstra (1, d[0]);
    for (int i=1; i<=k; i++){
        dijkstra (ubu[i], d[i]);
    }
    for (int i=1; i<=k; i++){
        for (int j=0; j<(1<<k); j++){
            D[i][j] = INT_MAX;
        }
        D[i][(1<<(i-1))] = d[0][ubu[i]];
    }
    for (int i=1; i<(1<<k); i++){
        for (int j=1; j<=k; j++){
            if (D[j][i] != INT_MAX){
                for (int p=1; p<=k; p++){
                    if(!((i>>(p-1))&1)){
                        ii = i;
                        ii |= (1<<(p-1));
                        D[p][ii] = min (D[p][ii], D[j][i] + d[j][ubu[p]]);
                    }
                }
            }
        }
    }
    for(int i=1; i<=k; i++){
        sol = min (sol, D[i][(1<<k)-1] + d[i][n]);
    }
    fout << sol;
    return 0;
}
//masca de biti ca sa stiu nodurile prin care am trecut