Cod sursa(job #3200526)

Utilizator Robert_NicuNicu Robert Cristian Robert_Nicu Data 4 februarie 2024 22:19:50
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>
#define DIM 10000
#define INF 2*(1e9)
using namespace std;

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

int n, m, k, a, b, c, nod, vecin, cost_vecin, last, ans=1e9;
int drum[17][DIM], prieten[16], dp[16][4*DIM];
int i, j, mask;
vector <pair <int, int> > G[DIM];
set <pair <int, int> > s;

void dijkstra(int pos, int start){
    for(j=1; j<=n; j++)
        drum[pos][j]=INF;
    drum[pos][start]=0;
    s.insert(make_pair(0, start));
    while(!s.empty()){
        nod=s.begin()->second;
        s.erase(s.begin());
        for(auto v:G[nod]){
            vecin=v.first;
            cost_vecin=v.second;
            if(drum[i][vecin]>drum[i][nod]+cost_vecin){
                s.erase({drum[i][vecin], vecin});
                drum[i][vecin]=drum[i][nod]+cost_vecin;
                s.insert({drum[i][vecin], vecin});
            }
        }
    }
}

int main(){
    fin>>n>>m>>k;
    prieten[0]=1;
    for(i=1; i<=k; i++){
        fin>>prieten[i];
    }
    for(i=1; i<=m; i++){
        fin>>a>>b>>c;
        G[a].push_back(make_pair(b, c));
        G[b].push_back(make_pair(a, c));
    }
    for(i=0; i<=k; i++)
        dijkstra(i, prieten[i]);
    if(k==0){
        fout<<drum[1][n];
        return 0;
    }
    for(i=1; i<=k; i++){
        for(mask=1; mask<(1LL<<k); mask++)
            dp[i][mask]=INF;
        dp[i][1LL<<(i-1)]=drum[i][1];
    }
    for(mask=1; mask<(1LL<<k); mask++){
        for(i=1; i<=k; i++){
            if(dp[i][mask]!=INF)
            for(j=1; j<=k; j++){
                if(!((mask>>(j-1))&1) && i!=j){
                    dp[j][(mask+(1LL<<(j-1)))]=min(dp[j][(mask>>(j-1))], dp[i][mask]+drum[i][prieten[j]]);
                }
            }
        }
    }
    for(i=1; i<=k; i++)
        ans=min(ans, dp[i][(1LL<<k)-1]+drum[i][n]);
    fout<<ans;
}