Cod sursa(job #2148608)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 1 martie 2018 20:36:22
Problema Ubuntzei Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
# include <fstream>
# define DIM 2005
# define INF 1000000000
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int b[DIM][DIM],a[DIM][DIM],d[17][(1<<17)],v[DIM],rv[(1<<17)];
int n,m,nr,x,y,cost,i,j,k,sol;
int main () {
    fin>>n>>m>>nr;
    v[0]=1;
    for(i=1;i<=nr;i++)
        fin>>v[i];
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            b[i][j]=INF;
    for(i=1;i<=m;i++){
        fin>>x>>y>>cost;
        b[x][y]=b[y][x]=cost;
    }
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(b[i][j]>b[i][k]+b[k][j]&&i!=j&&i!=k&&j!=k)
                    b[i][j]=b[i][k]+b[k][j];
    for(i=1;i<(1<<(nr+1));i++)
        for(j=0;j<=nr;j++)
            d[j][i]=INF;
    for(i=1,j=0;j<=nr;i*=2,j++)
        rv[i]=j;
    d[0][1]=0;
    for(i=1;i<(1<<(nr+1));i++){
        if(i%2==0)
            continue;
        for(j=i;j>0;j-=(j&(-j))){
            x=rv[(j&(-j))];
            if(d[x][i]==INF)
                continue;
            for(k=(i^((1<<(nr+1))-1));k>0;k-=(k&(-k))){
                y=rv[(k&(-k))];
                d[y][i+(k&(-k))]=min(d[y][i+(k&(-k))],d[x][i]+b[v[x]][v[y]]);
            }
        }
    }
    sol=INF;
    for(i=1;i<=nr;i++)
        sol=min(sol,d[i][(1<<(nr+1))-1]+b[v[i]][n]);
    if(nr==0)
        fout<<b[1][n]<<"\n";
    else
        fout<<sol<<"\n";
    return 0;
}