Pagini recente » Istoria paginii utilizator/dan.butmalai | Cod sursa (job #2023109) | Cod sursa (job #96040) | Cod sursa (job #778758) | Cod sursa (job #1610318)
#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;
}