Pagini recente » Cod sursa (job #9594) | Cod sursa (job #2070474) | Cod sursa (job #586024) | Cod sursa (job #1806826) | Cod sursa (job #1895799)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#define N 2010
#define K 16
#define INF 1<<30
using namespace std;
vector < pair< int , int > > Edges[ N ];
vector < pair< int , int > >::iterator it ;
int NrNodes , NrEdges, NrImp;
int val [ N ];
int dist [ 1<< ( K + 1 ) ] [ N ];
int main(){
int x , y , cost , i ,j ;
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d",&NrNodes, &NrEdges);
scanf("%d",&NrImp);
for( i = 1 ; i <= NrImp ; i ++ ){
scanf("%d",&x);
val[ x ] = 1<<i ;
}
for ( i = 0 ; i < NrEdges ; i ++ ){
scanf("%d%d%d",&x,&y,&cost);
Edges [ x ].push_back ( make_pair( y , cost ));
Edges [ y ].push_back ( make_pair( x , cost ));
}
for( i = 0 ; i < 1<< ( NrImp + 1 ) ; i ++ ){
for ( j = 1 ; j <= NrNodes ; j++ ){
dist [ i ] [ j ] = INF ;
}
}
dist [ 0 ][ 1 ] = 0 ;
for ( j = 1 ; j <= NrNodes ; j ++){
for ( i = 0 ; i < (1<< (NrImp + 1 )) ; i ++ ) {
if ( dist [ i ][ j ] == INF ){
continue;
}
for ( it = Edges [ j ].begin() ; it != Edges [ j ].end() ; it ++ ){
x = it->first ;
if( val [ x ] == 0 ){
dist [ i ][ x ] = min ( dist [ i ][ x ] , dist [ i ][ j ]+ it->second );
continue ;
}
if( val[ x ] & i ){
continue ;
}
dist [ i + val [ x ] ][ x ] = min ( dist [ i + val [ x ] ][ x ] , dist [ i ][ j ]+ it->second );
}
}
}
int SolMin = INF ;
// for ( j = 1 ; j <= NrNodes ; j++ ){
// SolMin = min ( SolMin , dist [ (1<< ( NrImp +1 ) ) -2][ j ] );
// }
printf("%d",dist [ (1<< ( NrImp +1 ) ) -2][ NrNodes ] );
return 0;
}