Pagini recente » Cod sursa (job #924926) | Cod sursa (job #1855806) | Cod sursa (job #863181) | Cod sursa (job #2271430) | Cod sursa (job #1610542)
#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 ) );
}
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;
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 );
}
}
}
k++;
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;
}