Pagini recente » Cod sursa (job #742239) | Cod sursa (job #1750903) | Cod sursa (job #1543922) | Cod sursa (job #727243) | Cod sursa (job #2162708)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#define x first
#define y second
#define nmax 2005
#define mmax 10005
#define kmax 20
using namespace std;
ofstream fout ("ubuntzei.out");
ifstream fin ("ubuntzei.in");
int fol[nmax][kmax],crit[kmax];
int dp[nmax][kmax][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;
for( i = 1 ; i <= k ; i++ )
fin>>crit[ i ];
crit[ ++k ] = 1;
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 ] );
k -= 2;
maxim = ( 1 << k ) - 1;
for( mask = 0 ; mask <= maxim ; mask++ )
for( i = 1 ; i <= k ; i++ )
for( j = 1 ; j <= k ; j++ )
dp[ mask ][ i ][ j ] = 1e9;
for( i = 1 ; i <= k ; i++ )
dp[ 1 << ( i - 1 ) ][ i ][ i ] = 0;
for( mask = 1 ; mask <= k ; mask++ )
{
for( i = 1 ; i <= k ; i++ )
{
if( mask & ( 1 << ( i - 1 ) ) )
{
for( j = 1 ; j <= k ; j++ )
{
if( mask & ( 1 << ( j - 1 ) ) )
{
for( a = 1 ; a <= k ; a++ )
{
if( mask & ( 1 << ( a - 1 ) ) == 0 )
dp[ mask + ( 1 << ( a - 1 ) ) ][ i ][ a ] = min( dp[ mask + ( 1 << ( a - 1 ) ) ][ i ][ a ] , dp[ mask ][ i ][ j ] + fol[ crit[ a ] ][ j ] );
}
}
}
}
}
}
ans = 1e9;
for( i = 1 ; i <= k ; i++ )
for( j = 1 ; j <= k ; j++ )
ans = min( ans , dp[ maxim ][ i ][ j ] + fol[ crit[ i ] ][ k + 1 ] + fol[ crit[ j ] ][ k + 2 ] );
fout<<ans;
}