Cod sursa(job #2784429)

Utilizator marcumihaiMarcu Mihai marcumihai Data 16 octombrie 2021 14:18:24
Problema Ubuntzei Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m;
int k;
struct amic
{
    int indice;
    int cost;
};

amic prieteni[15];
vector <pair<int, int >> v[10005];

struct el
{
    int nod;
    int cost;
    int prieteni;

    bool operator < (const el &A)const
    {
        return cost>A.cost;
    }
};
int dp[255][17000];

int acum(int stare, int i)
{
    int baza=0;
    while(stare>0)
    {
        if(baza==i-1)
            return stare%2;
        stare=stare/2;
        ++baza;

    }
}


priority_queue <el> Q;

void Dijkstra()
{
    Q.push({1, 0, 0});
    while(!Q.empty())
    {
        int nod=Q.top().nod;
        int cost=Q.top().cost;
        int prietenacum=Q.top().prieteni;
        for(int x=0; x<v[nod].size(); ++x)
        {
            int fiu=v[nod][x].first;
            int cost=v[nod][x].second;
            int nrprieten=0;
            for(int i=1; i<=k; ++i)
                if(prieteni[i].indice==fiu)
                    nrprieten=i;

            if(dp[nod][prietenacum]+v[nod][x].second<dp[fiu][prietenacum])
            {
                dp[fiu][prietenacum]=dp[nod][prietenacum]+v[nod][x].second;
                Q.push({fiu, dp[fiu][prietenacum], prietenacum});
            }
            if(nrprieten!=0 && acum(prietenacum, nrprieten)==0 && dp[nod][prietenacum]+v[nod][x].second<dp[fiu][prietenacum+prieteni[nrprieten].cost])
            {
                dp[fiu][prietenacum+prieteni[nrprieten].cost]=dp[nod][prietenacum]+v[nod][x].second;
                Q.push({fiu, dp[fiu][prietenacum+prieteni[nrprieten].cost], prietenacum+prieteni[nrprieten].cost});
            }
        }
        Q.pop();
    }
}

int main()
{
    f>>n>>m>>k;
    int total=0;
    for(int i=1; i<=k; ++i)
    {
        f>>prieteni[i].indice;
        prieteni[i].cost=pow(2, i-1);
        total+=prieteni[i].cost;

    }
    for(int i=1; i<=m; ++i)
    {
        int x, y,  cost;
        f>>x>>y>>cost;
        v[x].push_back({y, cost});
        v[y].push_back({x, cost});
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=0;j<=total;++j)
            dp[i][j]=99999999999;

    }
    dp[1][0]=0;
    Dijkstra();

    g<<dp[n][total];


    return 0;
}