Pagini recente » Cod sursa (job #972515) | Cod sursa (job #501174) | Cod sursa (job #2072199) | Cod sursa (job #2890142) | Cod sursa (job #2026587)
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
#define str pair<int,int>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m, D[2005][2005], k, s[15], Dp[15][32800], minim;
vector<str> v[2005];
priority_queue< str, vector<str>, greater<str> > q;
inline void dijkstra( int rad ){
D[rad][rad] = 0;
q.push( make_pair( 0, rad ) );
while( !q.empty() ){
str nod = q.top();
q.pop();
if( nod.first != D[rad][nod.second] ){
continue;
}
for( int i = 0; i < v[nod.second].size(); i++ ){
int vecin = v[nod.second][i].first;
int cost = v[nod.second][i].second;
if( D[rad][vecin] > D[rad][nod.second] + cost ){
D[rad][vecin] = D[rad][nod.second] + cost;
q.push( make_pair( D[rad][vecin], vecin ) );
}
}
}
return;
}
int main(){
fin >> n >> m;
fin >> k;
k--;
for( int i = 0; i <= k; i++ )
fin >> s[i];
for( int i = 1; i <= m; i++ ){
int a, b, c;
fin >> a >> b >> c;
v[a].push_back( make_pair( b, c ) );
v[b].push_back( make_pair( a, c ) );
}
memset( D, 0x3f3f3f3f, sizeof(D) );
dijkstra( 1 );
if( k == -1 ){
fout << D[1][n] << "\n";
return 0;
}
for( int i = 0; i <= k; i++ )
dijkstra( s[i] );
memset( Dp, 0x3f3f3f3f, sizeof(Dp) );
for( int mask = 1; mask <= (1<<k); mask++ ){
for( int j = 0; j <= k; j++ ){
if( ( (mask>>j) & 1 ) == 1 ){
if( mask == (1<<j) ){
Dp[j][mask] = D[1][ s[j] ];
}else{
for( int i = 0; i <= k; i++ ){
if( ( (mask>>i) & 1 ) == 1 && i != j ){
Dp[j][mask] = min( Dp[j][mask], Dp[i][mask - (1<<j)] + D[ s[i] ][j] );
}
}
}
}
}
}
minim = 0x3f3f3f3f;
for( int i = 0; i <= k; i++ ){
minim = min( minim, Dp[i][(1<<(k + 1)) - 1] + D[ s[i] ][n] );
}
fout << minim << "\n";
return 0;
}