Cod sursa(job #3141489)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 14 iulie 2023 11:14:41
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 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];
int e[2001],c[16],n,k,m,x,y,cost,vecin,i,j,minim,l,nr,dp[16][2001],d[16][32769];
void f (int nod,int 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 (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 (j=1; j<=(1<<(k-1)); j++)
    {
        for (i=1; i<=k; i++)
        {
            if (((j>>(i-1))&1)==0)
                continue;
            for (l=1; l<=k; l++)
            {
                if (j>>(l-1)&1)
                    continue;
                nr=j+(1<<(l-1));
                d[l][nr]=min (d[l][nr],d[i][j]+dp[i][c[l]]);
            }
        }
    }
    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;
}