Cod sursa(job #3343870)

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

#define NMAX 2002
#define KMAX 16

int n,m,k,d[NMAX][1<<KMAX],ci[NMAX];
vector<pair<int,int>>g[NMAX];
struct path{
    int nod,c,mk;
    friend bool operator<(const path&p1,const path&p2){
        if(p1.c!=p2.c)return p1.c>p2.c;
        if(p1.mk!=p2.mk)return p1.mk<p2.mk;
        return p1.nod<p2.nod;
    }
};
priority_queue<path>pq;
signed main(){
#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;
        ci[x]=i;
    }
    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});
    }
    for(int i=0;i<=n;++i){
        for(int mk=0;mk<(1<<k);++mk){
            d[i][mk]=0x7fffffff;
        }
    }
    d[1][0]=0;
    pq.push({1,0,0});
    while(!pq.empty()){
        int i=pq.top().nod,c=pq.top().c,mk=pq.top().mk;
        pq.pop();
        if(c>d[i][mk])continue;
        for(auto it:g[i]){
            int nmk=mk;
            if(ci[it.first])nmk|=(1<<(ci[it.first]-1));
            if(d[it.first][nmk]>d[i][mk]+it.second){
                d[it.first][nmk]=d[i][mk]+it.second;
                pq.push({it.first,d[it.first][nmk],nmk});
            }
        }
    }
    cout<<d[n][(1<<k)-1];
    return 0;
}