Pagini recente » Cod sursa (job #2503758) | Cod sursa (job #1715798) | Cod sursa (job #2203971) | Cod sursa (job #2308356) | Cod sursa (job #2164028)
#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 ];
}