Cod sursa(job #2590427)

Utilizator tavi255Varzaru Octavian Stefan tavi255 Data 27 martie 2020 21:56:42
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
//#include <iostream>
#include <bits/stdc++.h>
using namespace std;

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

const int Max=2005;
int n,m,k; bool imp[Max],incoada[Max][16];
vector < pair <int ,int > >v[Max];
int dist[Max][16];

struct coada
{
    int nod,nrk;
};

struct compara
{
    bool operator()(coada q1,coada q2)
    {
        return dist[q1.nod][q1.nrk]>dist[q2.nod][q2.nrk];
    }
};

priority_queue < coada,vector <coada>,compara >pq;

void citire()
{
    in>>n>>m;
    in>>k;
    for(int i=1;i<=k;i++)
    {
        int x; in>>x;
        imp[x]=1;
    }
    for(int i=1;i<=m;i++)
    {
        int x,y,z;;
        in>>x>>y>>z;
        v[x].push_back({y,z});
        v[y].push_back({x,z});
    }
}

void Dijkstra()
{
    for(int i=2;i<=n;i++)
        for(int j=0;j<=k;j++)
        dist[i][j]=(1<<31)-1;

    pq.push({1,0});

    while(!pq.empty())
    {
        int nod=pq.top().nod; int nrt=pq.top().nrk; pq.pop(); incoada[nod][nrt]=0;
        for(int j=0;j<v[nod].size();j++)
        {
            int vec=v[nod][j].first;
            int cost=v[nod][j].second;
            int nrp=nrt+imp[vec];
            if(dist[vec][nrp]>dist[nod][nrt]+cost)
            {
                dist[vec][nrp]=dist[nod][nrt]+cost;
                if(!incoada[vec][nrp])
                {
                    incoada[vec][nrp]=1;
                    pq.push({vec,nrp});
                }
            }
        }
    }
}

int main()
{
    citire();
    Dijkstra();
    out<<dist[n][k];
    return 0;
}