Cod sursa(job #2481078)

Utilizator YouDontNeedMyNameJurcut Paul YouDontNeedMyName Data 26 octombrie 2019 13:38:28
Problema Ubuntzei Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
#define nmax 2005
#define smax 32770
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k,prt[nmax],v[nmax][smax];
bool processed[nmax][smax];
vector <pair<int,int> > lista[nmax];
void read(){
    in >> n >> m;
    in >> k;
    for(int i=1; i<=k; i++){
        int x;
        in >> x;
        prt[x]=i;
    }
    for(int i=1; i<=m; i++){
        int x,y,cost;
        in >> x >> y >> cost;
        lista[x].push_back({y,cost});
        lista[y].push_back({x,cost});
    }
}
priority_queue <pair<int,pair<int,int> > > pq;
void dijkstra(){
    for(int i=1; i<=n; i++)
        for(int j=0; j<smax; j++)
            v[i][j]=INT_MAX;
    pq.push({0,{1,0}});
    v[1][0]=0;
    while(!pq.empty()){
        int cost = -pq.top().first;
        int node = pq.top().second.first;
        int masca = pq.top().second.second;
        pq.pop();
        if(processed[node][masca]) continue;
        processed[node][masca]=1;
        if(node == n && masca == (1<<k)-1){
            out << v[node][masca] << '\n';
            return;
        }
        for(auto x:lista[node]){
            int vecin = x.first;
            int dist = x.second;
            int masca_noua;
            if(prt[vecin])
                masca_noua = (masca | (1<<(prt[vecin]-1)));
            else
                masca_noua = masca;
            if(cost + dist < v[vecin][masca_noua]){
                v[vecin][masca_noua] = cost+dist;
                pq.push({-v[vecin][masca_noua],{vecin,masca_noua}});
            }
        }
    }
}
int main()
{
    read();
    dijkstra();
}