Cod sursa(job #3198743)

Utilizator MrPuzzleDespa Fabian Stefan MrPuzzle Data 30 ianuarie 2024 13:10:03
Problema Ubuntzei Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <bits/stdc++.h>

#define INF 1000000000
#define DIM 2000
#define E 15

#define pii pair<int,int>
#define pipii pair<int,pii>

using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int n,m,k;
int id[DIM+5];
int x,y,c;

vector <pii> L[DIM+5];

int d[DIM+5][1<<(E+1)];

priority_queue <pipii,vector<pipii>,greater<pipii>> q;

void dijkstra(int start){

    d[start][0] = 0;

    q.push({0,{start,0}});

    while(!q.empty()){
        int cost = q.top().first;
        int nod = q.top().second.first;
        int l = q.top().second.second;
        q.pop();

        //cout<<cost<<" "<<nod<<" "<<l<<'\n';

        if(d[nod][l] != cost){
            continue;
        }

        for(int i=0;i<L[nod].size();i++){
            int vec = L[nod][i].first;
            int c = L[nod][i].second;
            int newl = l;
            int newcost = cost+c;
            if(id[vec]!=-1){

                if(newl & (1<<id[vec])){
                    continue;
                }

                newl += (1<<id[vec]);
            }

            if(d[vec][newl] > newcost){
                d[vec][newl] = newcost;
                q.push({d[vec][newl],{vec,newl}});
            }

        }
    }
}

int main(){

    f>>n>>m;
    f>>k;

    for(int i=1;i<=n;i++){
        id[i] = -1;
    }

    for(int i=0;i<k;i++){
        f>>x;
        id[x] = i;
    }

    for(int i=1;i<=m;i++){
        f>>x>>y>>c;
        L[x].push_back({y,c});
        L[y].push_back({x,c});
    }

    for(int i=1;i<=n;i++){
        for(int l = 0;l<(1<<k);l++){
            d[i][l] = INF;
        }
    }

    dijkstra(1);

    g<<d[n][(1<<k) - 1];
    return 0;
}