Cod sursa(job #3141513)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 14 iulie 2023 12:09:08
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <set>
#include <vector>
#define inf 100000000
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
set <pair <int,int>> s;
vector <pair <int,int>> v[2001];
long long e[2001],c[16],n,k,m,x,y,cost,vecin,i,j,minim,l,nr,dp[16][2001],d[32769][16];
void f (long long nod,long long d[])
{
    for (i=1; i<=n; i++)
        d[i]=inf;
    d[nod]=0;
    s.insert (make_pair(0,nod));
    while (!s.empty ())
    {
        nod=s.begin ()->second;
        s.erase (s.begin ());
        for (i=0; i<v[nod].size (); i++)
        {
            vecin=v[nod][i].first;
            cost=v[nod][i].second;
            if (d[vecin]>d[nod]+cost)
            {
                s.erase (make_pair (d[vecin],vecin));
                d[vecin]=d[nod]+cost;
                s.insert (make_pair (d[vecin],vecin));
            }
        }
    }
}
int main ()
{
    fin>>n>>m>>k;
    for (i=1; i<=k; i++)
        fin>>c[i];
    for (i=1; i<=m; i++)
    {
        fin>>x>>y>>cost;
        v[x].push_back (make_pair (y,cost));
        v[y].push_back (make_pair (x,cost));
    }
    for (j=1; j<=(1<<k)-1; j++)
    {
        for (i=1; i<=k; i++)
            d[j][i]=inf;
    }
    for (i=1; i<=k; i++)
        //f (c[i],dp[i]);
    //f (1,e);
    for (i=1; i<=k; i++)
        d[(1<<(i-1))][i]=e[c[i]];
    for (i=1; i<=(1<<k)-1; i++)
    {
        for (j=1; j<=k; j++)
        {
            if (((i>>(j-1))&1)==0||i-(1<<(j-1))==0)
                continue;
            for (l=1; l<=k; l++)
            {
                if (l==j||((i>>(l-1))&1)==0)
                    continue;
                nr=i-(1<<(j-1));
                d[i][j]=min (d[i][l],d[nr][l]+dp[l][c[j]]);
            }
        }
    }
    minim=inf;
    for (i=1; i<=k; i++)
    {
        if (d[(1<<k)-1][i]+dp[i][n]<minim)
            minim=d[(1<<k)-1][i]+dp[i][n];
    }
    fout<<minim;
    return 0;
}