Cod sursa(job #3308879)

Utilizator InformaticianInDevenire1Munteanu Mihnea Gabriel InformaticianInDevenire1 Data 29 august 2025 10:47:51
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <bits/stdc++.h>

using namespace std;

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

vector <pair<int,int>> gr[2005];
priority_queue <pair<int,int>> pq;
int dist[2005];
int ks[22];
int mx[22][22]; // matricea de adiacenta
int dp[1<<20][22];

void Dijkstra(int node,int n){
    for (int i=1;i<=n;++i) dist[i] = 1e9;
    dist[node] = 0;
    pq.push({-dist[node],node});
    while (!pq.empty()){
        int cnode = pq.top().second;
        int dst = -pq.top().first;
        pq.pop();
        if (dst!=dist[cnode]) continue;
        for (auto vec:gr[cnode]){
            if (dist[vec.first]<=dist[cnode]+vec.second) continue;
            dist[vec.first] = dist[cnode]+vec.second;
            pq.push({-dist[vec.first],vec.first});
        }
    }
}

bool CheckBit(int msk,int bit){ // este bitul 1?
    return (msk&(1<<bit))!=0;
}

int Add(int msk,int bit){
    return msk|(1<<bit);
}

int Ciclu_Hamiltonian(int n){
    for (int i=0;i<(1<<n);++i){
        for (int j=0;j<n;++j){
            dp[i][j] = 1e9;
        }
    }
    dp[1][0] = 0;
    for (int msk=0;msk<(1<<n);msk++){
        for (int nod1=0;nod1<n;++nod1){
            if (!CheckBit(msk,nod1)) continue;
            for (int nod2=0;nod2<n;++nod2){
                if (CheckBit(msk,nod2) or nod1==nod2) continue;
                int msk2 = Add(msk,nod2);
                dp[msk2][nod2] = min(dp[msk2][nod2],dp[msk][nod1]+mx[nod1][nod2]);
            }
        }
    }
    int ans = dp[(1<<n)-1][n-1];
    return ans;
}

int main()
{
    int n,m,k;
    fin >> n >> m >> k;
    for (int i=1;i<=k;++i){
        fin >> ks[i];
    }
    for (int i=1;i<=m;++i){
        int x,y,dst;
        fin >> x >> y >> dst;
        gr[x].push_back({y,dst});
        gr[y].push_back({x,dst});
    }
    ks[0] = 1;
    ks[k+1] = n;
    for (int i=0;i<=k+1;++i){
        for (int j=0;j<=k+1;++j){
            mx[i][j] = 1e9;
        }
    }
    for (int i=0;i<=k+1;++i){
        Dijkstra(ks[i],n);
        for (int j=0;j<=k+1;++j){
            mx[i][j] = dist[ks[j]];
            //mx[j][i] = dist[ks[j]];
        }
    }
    int ans = Ciclu_Hamiltonian(k+2);
    fout << ans;
    return 0;
}