Cod sursa(job #2480306)

Utilizator BaraianTudorBaraian Tudor Stefan BaraianTudor Data 25 octombrie 2019 11:41:33
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define pb push_back
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
struct eee
{
    int nod,cost;
    bool operator <(const eee &a)const
    {
        return cost>a.cost;
    }
};
struct aaa
{
    int nod,cost,oras;
    bool operator <(const aaa &a)const
    {
        return cost>a.cost;
    }
};
int n,m,a1,b1,c1,dp[16][2005],b[16][2005],loc[16],ap[2005],x,y,k,z,dmin[2005];
vector<eee> v[2005];
priority_queue<aaa> q;
priority_queue<eee> q1;
int main()
{
    in>>n>>m>>k;
    for(int i=1;i<=n;i++)
    {
        dmin[i]=1<<30;
    }
    for(int i=1;i<=k;i++)
    {
        in>>loc[i];
        ap[loc[i]]=1;
    }
    for(int i=1;i<=m;i++)
    {
        in>>a1>>b1>>c1;
        v[a1].pb({b1,c1});
        v[b1].pb({a1,c1});
    }
    for(int i=1;i<=k;i++)
    {
        for(int j=1;j<=n;j++)
        {
            dp[i][j]=1<<30;
        }
    }
    q.push({1,0,0});
    dp[0][1]=0;
    while(!q.empty())
    {
        x=q.top().nod;
        y=q.top().cost;
        z=q.top().oras;
        q.pop();
        for(auto i:v[x])///orasele vecine
        {
            if(z<k)///daca mai putem adauga prieteni
            {
                if( ap[i.nod] && dp[z+1][i.nod]>dp[z][x]+i.cost)///daca avem prieten nou si nu l-am mai colectat
                {
                    dp[z+1][i.nod]=dp[z][x]+i.cost;///cost nou
                    q.push({i.nod,dp[z+1][i.nod],z+1});
                }
                else if(dp[z][i.nod]>dp[z][x]+i.cost)///daca avem drum fara prieten si putem ajunge cu un cost mai bun
                {
                    dp[z][i.nod]=dp[z][x]+i.cost;
                    q.push({i.nod,dp[z][i.nod],z});
                }
            }
        }
    }
    for(int i=1;i<=k;i++)
    {
        q1.push({loc[i],dp[k][loc[i]]});
        dmin[loc[i]]=1;
    }
    while(!q1.empty())
    {
        x=q1.top().nod;
        y=q1.top().cost;
        q1.pop();
        for(auto i:v[x])
        {
            if(dmin[i.nod]>dmin[x]+i.cost)
            {
                dmin[i.nod]=dmin[x]+i.cost;
                q1.push({i.nod,dmin[i.nod]});
            }
        }
    }
    out<<dmin[n];
    return 0;
}