Cod sursa(job #3210185)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 5 martie 2024 12:45:00
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <queue>
#include <set>
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout("ubuntzei.out");
struct elem
{
    int nod,c;
};
struct cmp
{
    bool operator()(const elem& a,const elem& b)const{
        if(a.c==b.c)
            return a.nod<b.nod;
        return a.c<b.c;
    }
};
const int INF=1e9;
int P,n,m,k,x,y,j,cost,i,V[18],dist[21][21],D[2001],sol[(1<<17)][21];
vector <elem> L[2003];
set <elem,cmp> S;
int main()
{
    fin>>n>>m;
    fin>>k;
    for(i=1;i<=k;i++)
        fin>>V[i];
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>cost;
        L[x].push_back({y,cost});
        L[y].push_back({x,cost});
    }
    V[0]=1;
    V[k+1]=n;
    for(i=0;i<=k+1;i++)
    {
        for(j=1;j<=n;j++)
            D[j]=INF;
        S.insert({V[i],0});
        D[V[i]]=0;
        while(!S.empty())
        {
            int fr=S.begin()->nod;
            S.erase(S.begin());
            for(auto l:L[fr])
            {
                if(D[l.nod]>D[fr]+l.c)
                {
                    S.erase({l.nod,D[l.nod]});
                    D[l.nod]=D[fr]+l.c;
                    S.insert({l.nod,D[l.nod]});
                }
            }
        }
        for(j=0;j<=k+1;j++)
        {
            dist[i][j]=D[V[j]];
            dist[j][i]=D[V[j]];
        }
        dist[i][i]=INF;
    }
    for(i=0;i<(1<<(k+2));i++)
        for(j=0;j<=k+1;j++)
            sol[i][j]=INF;
    sol[0][0]=0;
    dist[0][0]=0;
    for(i=0;i<(1<<(k+2));i++)
        for(j=0;j<k+2;j++)
            if(i&(1<<j))
                for(int l=0;l<k+2;l++)
                    sol[i][j]=min(sol[i][j],sol[i-(1<<j)][l]+dist[l][j]);
    fout<<sol[(1<<(k+2))-1][k+1];
    return 0;
}