Cod sursa(job #2868039)

Utilizator csamoilasamoila ciprian casian csamoila Data 10 martie 2022 18:22:31
Problema Ubuntzei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax = 2e2 + 1;
const int smax = (2<<10) + 1;
const int inf = 1e9;

int N,M;
int K;
vector<int> C;
vector<pair<int,int>>ADJ[nmax];

int DP[smax][nmax];

int F[nmax];

struct inHeap{
    int mask,nod,dist;
    bool operator<(const inHeap aux) const{
        return aux.dist<dist;
    }
};

priority_queue<inHeap>Q;

void update(int mask,int nod,int dist){
    if(dist<DP[mask][nod]){
        DP[mask][nod]=dist;
        Q.push({mask,nod,dist});
    }
}

int Dijkstra(){
    for(int i=0;i<=(2<<K);i++)
        for(int j=1;j<=N;j++)
            DP[i][j]=inf;
    Q.push({0,1,0});
    DP[0][1]=0;
    while(!Q.empty()){
        inHeap x=Q.top();
        Q.pop();
        int p=-1;
        for(int i=0;i<K;i++)
            if(C[i]==x.nod)
                p=i;
        if(p!=-1 and !(x.mask&(1<<p))){
            int new_mask=(x.mask^(1<<p));
            update(new_mask,x.nod,x.dist);
        }
        for(auto it:ADJ[x.nod])
            update(x.mask,it.first,x.dist+it.second);
    }
    return DP[(1<<K)-1][N];
}

int main()
{
    fin >> N >> M;
    fin >> K;
    C=vector<int>(K);
    for(int i=0;i<K;i++)
        fin >> C[i];
//    for(int i=1;i<=K;i++)
//        F[C[i]]=1;
    for(int i=1;i<=M;i++){
        int a,b,c;
        fin >> a >> b >> c;
        ADJ[a].push_back({b,c});
        ADJ[b].push_back({a,c});
    }
    fout << Dijkstra();
    return 0;
}