Cod sursa(job #1610569)

Utilizator DysKodeTurturica Razvan DysKode Data 23 februarie 2016 17:28:13
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

const int INF = 1000000000;
const int MAXX = 1<<18;
const int MAXN = 18;

#define f first
#define s second

vector < pair< int , int > > Graf[ 2010 ];
vector < int > Ubu[20];
int n,m,k,localitatea[20],i,j,x,y,c,drum[2010],ans;
int Cost[MAXN][MAXN],Ham[MAXX][MAXN];
queue < int > Q;

void BFS( int nod )
{
    for( int i = 0 ; i <= n ; i++ )
        drum[ i ] = INF;
    drum[ nod ] = 0;
    Q.push( nod );
    while( Q.size() )
    {
        x = Q.front();
        Q.pop();
        for( vector< pair<int,int> > :: iterator it = Graf[ x ].begin() ; it != Graf[ x ].end() ; it++ )
        {
            if( drum[ (*it).first ] > drum[ x ] + (*it).second )
            {
                drum[ (*it).first ] = drum[ x ] + (*it).second;
                Q.push( (*it).first );
            }
        }
    }
}

int main()
{
    fin>>n>>m;
    fin>>k;
    localitatea[ 0 ] = 1;
    localitatea[ k + 1 ] = n;
    for( i = 1 ; i <= k ; i++ )
        fin>>localitatea[ i ];
    for( i = 1 ; i <= m ; i++ )
    {
        fin>>x>>y>>c;
        Graf[ x ].push_back( make_pair( y , c ) );
        Graf[ y ].push_back( make_pair( x , c ) );
    }
    k++;
    k++;

    for( i = 0 ; i < ( 1 << k ) ; i++ )
    for( j = 0 ; j <= k ; j++ )
        Ham[ i ][ j ] = INF;

    for( i = 0 ; i <= k ; i++ )
    for( j = 0 ; j <= k ; j++ )
        Cost[ i ][ j ] = INF;

    for( i = 0 ; i <= k ; i++ )
    {
        BFS( localitatea[ i ] );
        for( j = 0 ; j <= k ; j++ )
        {
            if( i != j )
            {
                Cost[ i ][ j ] = drum[ localitatea[ j ] ];
                Ubu[ j ].push_back( i );
            }
        }
    }

    Ham[ 1 ][ 0 ] = 0;
    for( i = 1 ; i < ( 1 << k ) ; i++ )
    for( j = 0 ; j < k ; j++ )
        if( i & ( 1 << j ) )
            for( auto it : Ubu[ j ] )
                Ham[ i ][ j ] = min( Ham[ i ][ j ] , Ham[ i ^ (1<<j) ][ it ] + Cost[ it ][ j ] );

    fout<<Ham[ ( 1 << k ) - 1 ][ k - 1 ];
return 0;
}