Cod sursa(job #2164028)

Utilizator vlasiuflaviusVlasiu Flavius vlasiuflavius Data 12 martie 2018 21:06:46
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#define x first
#define y second
#define nmax 2005
#define mmax 10005
#define kmax 20
#define maskmax 133000
using namespace std;
ofstream fout ("ubuntzei.out");
ifstream fin ("ubuntzei.in");
int fol[nmax][kmax],crit[kmax];
int dp[maskmax][kmax];
int n,m,k,i,j,a,b,c,maxim,mask,ans;
vector < pair < int , int > > w[nmax];
priority_queue < pair < int , int > > q;
pair < int , int > aux;
void dijk( int poz , int start )
{
    q.push( { 0 , start } );
    while( q.size() )
    {
        aux = q.top();
        q.pop();
        if( fol[ aux.y ][ poz ] )
            continue;
        fol[ aux.y ][ poz ] = -aux.x;
        for( auto it : w[ aux.y ] )
            if( !fol[ it.x ][ poz ] && it.x != start )
                q.push( { aux.x - it.y , it.x } );
    }
}
int main()
{
    fin>>n>>m;
    fin>>k;
    crit[ 1 ] = 1;
    k++;
    for( i = 2 ; i <= k ; i++ )
        fin>>crit[ i ];
    crit[ ++k ] = n;
    for( i = 1 ; i <= m ; i++ )
    {
        fin>>a>>b>>c;
        w[ a ].push_back( { b , c } );
        w[ b ].push_back( { a , c } );
    }
    for( i = 1 ; i <= k ; i++ )
        dijk( i , crit[ i ] );
    maxim = ( 1 << k ) - 1;
    for( mask = 0 ; mask <= maxim ; mask++ )
        for( i = 1 ; i <= k ; i++ )
                dp[ mask ][ i ] = 1e9;
    dp[ 1 ][ 1 ] = 0;
    for( mask = 1 ; mask <= maxim ; mask++ )
    {
        for( i = 1 ; i <= k ; i++ )
        {
            if( mask & ( 1 << ( i - 1 ) ) )
            {
                for( a = 1 ; a <= k ; a++ )
                {
                    if( ( mask & ( 1 << ( a - 1 ) ) ) == 0 )
                        dp[ mask + ( 1 << ( a - 1 ) ) ][ a ] = min( dp[ mask + ( 1 << ( a - 1 ) ) ][ a ] , dp[ mask ][ i ] + fol[ crit[ a ] ][ i ] );
                  ///  cout<<dp[ mask + ( 1 << ( a - 1 ) ) ][ a ]<<" "<<a<<" "<<i<<endl;
                }
            }
        }
    }
    fout<<dp[ maxim ][ k ];
}