Cod sursa(job #874614)

Utilizator ilenitudorIleni Tudor ilenitudor Data 9 februarie 2013 01:00:29
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<fstream>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int a[2001][2001],m,n,k,p[2001],minn = 999;
int o[16],sol[20];
void Read()
{
    fin>>n>>m>>k;
        for(int i=1 ; i<=k ; i++)
            fin>>o[i];
    for(int i=1 ; i<=m ; i ++)
    {   int x,y,z;
        fin>>x>>y>>z;
        a[x][y] = z;
        a[y][x] = z;
    }
}
void rf()
{
    for(int q=1 ; q<=n ;q++)
        for(int i=1 ; i<=n ; i++)
            for(int j=1 ; j<=n ; j++)
            if( a[i][q] && a[q][j] && i!=j )
            if( ( a[i][q] + a[q][j] < a[i][j] ) || !a[i][j]  )
                    a[i][j] = a[i][q] + a[q][j];
}

void permutari(int pas , int sp)
{
    for(int i=1 ; i<=k ; i++)
    if(!p[o[i]])
    {
        p[o[i]] = 1;
        sol[pas] = o[i];

        if(pas==1)
            sp += a[1][o[i]];
        else
            sp += a[sol[pas-1]][sol[pas]];

            if( pas == k ){ sp+=a[sol[pas]][ n ];
                            if(sp < minn) minn = sp;
                          }
            else permutari(pas+1 , sp);

        if(pas==1)           sp -= a[1][o[i]];
        else if (pas < n)    sp -= a[sol[pas-1]][sol[pas]];
        else if( pas == k )  sp-=a[sol[pas]][ n ];

        p[o[i]] = 0;


    }
}

int main()
{
    Read();
    rf();
    if(k==0)fout<<a[1][n];
    else if(k!=0)
   {

    permutari(1,0);
    fout<<minn;
   }
    fin.close();
    fout.close();
    return 0;
}