Cod sursa(job #830129)

Utilizator lucian666Vasilut Lucian lucian666 Data 6 decembrie 2012 14:35:45
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb



//Vasilut
#include<fstream>
#include<vector>
#include<utility>
#include<cstring>

#define NN 2010
#define INF 0x3f3f3f3f

using namespace std;
ofstream out("ubuntzei.out");

int n,m,K,v[NN],a[NN][NN],sol[NN],ans=INF;
bool uz[NN];

void read();
void RF();
void back(int k);
void write_sol();

int main()
{
    read();
    RF();
    if ( K )
    {
    back(1);
    out<<ans<<'\n';
    }
    else
    out<<a[1][n];
    return 0;
}

void read()
{
    ifstream in("ubuntzei.in");
    in>>n>>m;
    in>>K;
    for(int i=1;i<=K;i++)
        in>>v[i];
        memset(a,INF,sizeof a );
            for(int i=1;i<=n;i++)
                a[i][i] = 0;
                    for( int x,y,c ; m ; --m )
                    {
                        in>>x>>y>>c;
                        a[x][y] = a[y][x] = c;
                    }
}

void RF()
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                a[i][j] = min ( a[i][j] , a[i][k] + a[k][j] );
}


void back(int k)
{
        for(int i=1;i<=K;i++)
            if ( !uz[i] )
            {
                sol[k] = i;
                uz[i] = 1;
                    if ( k == K )
                        write_sol();
                            else
                        back(k+1);
                        uz[i] = 0;
            }
}


void write_sol()
{
    int ttime = 0;
    ttime = a[ 1 ][ v[ sol[ 1 ] ] ] + a[ v[ sol[ K ] ] ][ n ]  ;
    for(int i=1;i<K;i++)
        ttime += a[ v[ sol[i] ] ][ v[ sol[ i+1 ] ] ];
            ans = min ( ans , ttime );
}