Cod sursa(job #1610318)

Utilizator DysKodeTurturica Razvan DysKode Data 23 februarie 2016 13:56:28
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 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<<17;
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];
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++ )
        {
            int abc = (*it).first;
            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 ) );
    }
    k++;

    for( i = 0 ; i <= 1 << n ; 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;
    k--;

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

    for( i = 0 ; i <= k + 1 ; i++ )
        Cost[ i ][ i ] = 0;
    Ham[ 1 ][ 0 ];
    for( i = 1 ; i < (1<<n) ; i++ )
    for( j = 0 ; j <= k ; j++ )
        if( i & (1<<j) )
            for( vector<int>::iterator it = Ubu[ j ].begin() ; it != Ubu[ j ].end() ; it++ )
                Ham[ i ][ j ] = min( Ham[ i ][ j ] , Ham[ i ^ (1<<j) ][ *it ] + Cost[ *it ][ j ] );
    ans = INF;
    for( i = 0 ; i <= k ; i++ )
        ans = min( ans , Ham[ 1<<k - 1 ][ i ] + Cost[ i ][ k + 1 ] );
    fout<<ans;
return 0;
}