Cod sursa(job #3307281)

Utilizator informatica1218alexia petre informatica1218 Data 19 august 2025 15:52:51
Problema Ubuntzei Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include "bits/stdc++.h"
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
long long d[20][2002],l[20],dp[33000][20];
int main ()
{
    long long n,m,k,x,i,j,c,y,a1,a2,min1,mask,a;
    set <pair<long long,int>> s;
    vector <pair<int,int>> v[2002];
    f>>n>>m>>k;
    k++;
    l[1]=1;
    for (x=2;x<=k;x++)
    {
        f>>l[x];
    }
    k++;
    l[k]=n;
    for (x=1;x<=m;x++)
    {
        f>>i>>j>>c;
        v[i].push_back ({j,c});
        v[j].push_back ({i,c});
    }
    for (x=1;x<=k;x++)
    {
        for (y=1;y<=n;y++)
            d[x][y]=1500000000;
        d[x][l[x]]=0;
        s.insert ({0,l[x]});
        while (s.size ()!=0)
        {
            a1=s.begin()->first;
            a2=s.begin()->second;
            s.erase(s.begin());
            for (auto a : v[a2])
            {
                j=a.first;
                c=a.second;
                if (d[x][j]>d[x][a2]+c)
                {
                    if (d[x][j]!=1500000000)
                    {
                        s.erase ({d[x][j],j});
                    }
                    d[x][j]=d[x][a2]+c;
                    s.insert ({d[x][j],j});
                }
            }
        }
        for (y=1;y<=n;y++)
        {
            if (d[x][y]==1500000000) d[x][y]=0;
        }
    }
    for (mask=1;mask<a1;mask++)
    {
        for (x=2;x<k;x++)
        {
            dp[mask][x]=1500000000;
        }
    }
    a1=1<<(k-2);
    for (mask=1;mask<a1;mask++)
    {
        for (x=2;x<k;x++)
        {
            a=1<<(x-2);
            if (mask&a)
            {
                if (mask-a==0)
                {
                    if (d[1][l[x]]!=0)
                    {
                        dp[mask][x]=d[1][l[x]];
                    }
                }
                else
                {
                    for (y=2;y<k;y++)
                    {
                        a2=1<<(x-2);
                        if (mask&a2)
                        {
                            dp[mask][x]=min(dp[mask][x],dp[mask-a][y]+d[y][l[x]]);
                        }
                    }
                }
            }
        }
    }
    min1=1500000000;mask=1<<(k-2);
    for (x=2;x<k;x++)
    {
        if (d[x][n]!=0)
            min1=min(min1,dp[mask-1][x]+d[x][n]);
    }
    if (k==2) g<<d[1][n];
    else g<<min1;
    f.close ();
    g.close ();
    return 0;
}