Cod sursa(job #3039967)

Utilizator T1raduTaerel Radu Nicolae T1radu Data 29 martie 2023 09:34:50
Problema Ubuntzei Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int maxint=2000000000;
int n,k,m,A[2001][2001],D[2001][2001],tr[20],l[20][20],p[65636][20];
int main()
{
    fin >> n >> m;
    fin >> k;
    tr[0]=1;
    for(int i=1;i<=k;i++)
        fin >> tr[i];
    tr[k+1]=n;
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        fin >> x >> y >> c;
        A[x][y]=c;
        A[y][x]=c;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(A[i][j]==0) D[i][j]=maxint;
            else D[i][j]=A[i][j];
        }
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i!=j && D[i][k]!=maxint && D[k][j]!=maxint) D[i][j]=min(D[i][j],D[i][k]+D[k][j]);
            }
        }
    }

    for(int i=0;i<=k+1;i++)
    {
        for(int j=0;j<=k+1;j++)
        {
            if(i!=j && D[tr[i]][tr[j]]!=maxint)
            {
                l[i][j]=l[j][i]=D[tr[i]][tr[j]];
            }
        }
    }
    for(int mask=1;mask<(1<<(k+2));mask+=2)
    {
        for(int j=0;j<=k+1;j++)
            p[mask][j]=maxint;
    }
    p[1][0]=0;
    for(int mask=3;mask<(1<<(k+2));mask+=2)
    {
        for(int i=1;i<=k+1;i++)
        {
            int pov=(1<<i);
            if(pov&mask)
            {
                for(int j=0;j<=k+1;j++)
                {
                    if(l[i][j]!=0)
                    {
                        p[mask][i]=min(p[mask][i],p[mask^pov][j]+l[j][i]);
                    }
                }
            }
        }
    }
    fout << p[(1<<(k+2))-1][k+1];
    return 0;
}