Pagini recente » Cod sursa (job #3248095) | Cod sursa (job #3160083) | Cod sursa (job #1476977) | Cod sursa (job #1443722) | Cod sursa (job #2936154)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2000;
const int INF = 1e9;
const int KMAX = 15;
ifstream fin( "ubuntzei.in" );
ofstream fout( "ubuntzei.out" );
vector <pair<int, int>> edges[MAXN];
int dp[MAXN][1<<KMAX];
int nodes[KMAX+2];
int k, n;
queue <int> q;
bool marked[MAXN];
int dist[KMAX][KMAX], d[MAXN];
void bf( int node ) {
int i;
for( i = 0; i < n; i++ )
d[i] = INF, marked[i] = false;
q.push( node );
d[node] = 0;
while( !q.empty() ) {
auto qfront = q.front();
q.pop();
marked[qfront] = false;
for( auto vec: edges[qfront] ) {
if( d[vec.first] > d[qfront] + vec.second ) {
d[vec.first] = d[qfront] + vec.second;
if( !marked[vec.first] ) {
q.push( vec.first );
marked[vec.first] = true;
}
}
}
}
}
void calcDist() {
int i, j;
for( i = 0; i < k; i++ ) {
bf( nodes[i] );
for( j = 0; j < k; j++ )
dist[i][j] = d[nodes[j]];
}
}
int main() {
int m, i, a, b, cost, mask, node, j;
fin >> n >> m;
fin >> k;
nodes[0] = 0;
for( i = 1; i <= k; i++ ) {
fin >> nodes[i];
nodes[i]--;
}
nodes[k+1] = n - 1;
k += 2;
sort( nodes, nodes + k );
for( i = 0; i < m; i++ ) {
fin >> a >> b >> cost;
a--;
b--;
edges[a].push_back( { b, cost } );
edges[b].push_back( { a, cost } );
}
calcDist();
for( mask = 0; mask < ( 1 << KMAX ); mask++ ) {
for( i = 0; i < k; i++ )
dp[i][mask] = INF;
}
dp[0][1<<0] = 0;
for( mask = 1; mask < ( 1 << KMAX ); mask++ ) {
for( i = 0; i < k; i++ ) {
if( mask & ( 1 << i ) ) {
for( j = 0; j < k; j++ ) {
if( mask & ( 1 << j ) )
dp[j][mask] = min( dp[j][mask], dp[i][mask-(1<<j)] + dist[i][j] );
}
}
}
}
fout << dp[k-1][(1<<k)-1];
return 0;
}