Cod sursa(job #3208711)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 29 februarie 2024 14:01:04
Problema Ubuntzei Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 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()(elem a,elem b){return a.c<b.c;}
};
const int INF=1e9;
int P,n,m,k,x,y,j,cost,i,V[16],dist[21][21],D[2001],sol[(1<<17)][21];
vector <elem> L[2003];
set <pair<int,int>> 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({0,V[i]});
        D[V[i]]=0;
        while(!S.empty())
        {
            int fr=S.begin()->second;
            S.erase(S.begin());
            for(auto l:L[fr])
            {
                if(D[l.nod]>D[fr]+l.c)
                {
                    S.erase({D[l.nod],l.nod});
                    D[l.nod]=D[fr]+l.c;
                    S.insert({D[l.nod],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;
}