Cod sursa(job #3343872)

Utilizator IleaIlea Bogdan Ilea Data 28 februarie 2026 17:34:30
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<iostream>
#include<vector>
#include<queue>
using namespace std;

#define NMAX 2002
#define KMAX 16

int n,m,k,dp[1<<KMAX][KMAX];
vector<int>ubs,rd,d[KMAX];
vector<pair<int,int>>g[NMAX];
inline auto dijkstra(int start,vector<int>&dist)->void{
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
    pq.push({0,start});
    dist.resize(n+1,0X7FFFFFFF);
    dist[start]=0;
    while(!pq.empty()){
        int i=pq.top().second,c=pq.top().first;
        pq.pop();
        if(c>dist[i])continue;
        for(auto it:g[i]){
            int u=it.first;
            c=it.second;
            if(dist[u]>dist[i]+c){
                dist[u]=dist[i]+c;
                pq.push({dist[u],u});
            }
        }
    }
}
auto main()->signed{
    #ifndef LOCAL
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
    #endif // LOCAL
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    cin>>n>>m>>k;
    for(int i=1;i<=k;++i){
        int x;
        cin>>x;
        ubs.push_back(x);
    }
    for(int i=1;i<=m;++i){
        int x,y,z;
        cin>>x>>y>>z;
        g[x].push_back({y,z});
        g[y].push_back({x,z});
    }
    dijkstra(1,rd);
    for(int mk=0;mk<(1<<k);++mk){
        fill(dp[mk],dp[mk]+k,0X7FFFFFFF);
    }
    for(int i=0;i<k;++i){
        dijkstra(ubs[i],d[i]);
        dp[1<<i][i]=rd[ubs[i]];
    }
    if(k==0){
        cout<<rd[n];
        return 0;
    }
    for(int mk=1;mk<(1<<k);++mk){
        for(int i=0;i<k;++i){
            if(!(mk&(1<<i)))continue;
            for(int j=0;j<k;++j){
                if(!(mk&(1<<j)))continue;
                int u=ubs[i];
                dp[mk][i]=min(dp[mk][i],dp[mk-(1<<i)][j]+d[j][u]);
            }
        }
    }
    int ans=0X7FFFFFFF;
    for(int i=0;i<k;++i){
        ans=min(ans,dp[(1<<k)-1][i]+d[i][n]);
    }
    cout<<ans;
    return 0;
}