Cod sursa(job #2404079)

Utilizator avesserevVeress Eva avesserev Data 12 aprilie 2019 11:56:20
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>
#define pinf 10000000000000010
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
long long N,M,a[2010][2010],i,j,k,o[20],x,y,z,m[32780][20],c,rez,K,l,r,fv[32780],r2;
int main()
{
    c=-1;
    for(i=1; i<=(1<<15); i=i<<1)
    {
        c++;
        fv[i]=c;
    }
    fin>>N>>M>>K;
    for(i=1; i<=N; i++)
        for(j=1; j<=N; j++)
            if(i!=j)
                a[i][j]=pinf;

    for(i=0; i<K; i++)
        fin>>o[i];
    for(i=1; i<=M; i++)
    {
        fin>>x>>y;
        fin>>a[x][y];
        a[y][x]=a[x][y];
    }
    for(k=1; k<=N; k++)
    {
        for(i=1; i<=N; i++)
        {
            for(j=1; j<=N; j++)
            {
                if(a[i][j]>a[i][k]+a[k][j])
                {
                    a[i][j]=a[i][k]+a[k][j];
                }
            }
        }
    }
    cout<<~5;
    for(i=1; i<(1<<K); i++)
    {
        for(j=0; j<K; j++)
            m[i][j]=pinf;
    }
    c=-1;

    for(i=1; i<(1<<K); i=i<<1)
    {
        c++;
        m[i][c]=a[o[c]][1];
    }
    for(i=1; i<(1<<K); i++)
    {
        r=i;
        while(r!=0)
        {
            l=r&(-r);
            r=r-l;
            l=fv[l];
            r2=i;
            while(r2!=0)
            {
                j=r2&(-r2);
                r2=r2-j;
                j=fv[j];
                m[i+(1<<j)][j]=min(m[i+(1<<j)][j],m[i][l]+a[o[l]][o[j]]);
            }
        }
    }
    i=(1<<K)-1;
    rez=pinf;
    for(j=0; j<K; j++)
    {
        rez=min(rez,m[i][j]+a[N][o[j]]);
    }

    if(K==0)
        fout<<a[1][N];
    else
        fout<<rez;
}