Pagini recente » Cod sursa (job #3179390) | Cod sursa (job #2427585) | Cod sursa (job #2324179) | Cod sursa (job #600992) | Cod sursa (job #2708486)
#include <fstream>
#include <vector>
#include <queue>
#define infinite 1500000000
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int n, m, k;
int c[17];
typedef struct {
int to;
int len;
} edge;
edge make_edge ( int to, int len ) {
edge e;
e.to = to;
e.len = len;
return e;
}
vector < edge > G[ 2001 ];
int a[ 17 ][ 17 ];
bool inQueue[2001];
int dist[ 2001 ];
int DP[65550][15];
int Back ( int l, int last, int mask) {
if ( l > k ) {
return a[last][k+1];
}
if ( DP[mask][last-1] )
return DP[mask][last-1];
int res = infinite;
for ( int i = 1; i <= k; i++ ) {
if ( !( mask & ( 1 << (i-1) ) ) ) {
int temp = Back( l+1, i, mask | ( 1 << (i-1) ) );
res = min ( res, temp + a[last][i] );
}
}
DP[mask][last-1] = res;
return DP[mask][last-1];
}
void BellmanFord () {
queue <int> Q;
for ( int i = 0; i <= k; i++ ) {
for ( int j = 1; j <= n; j++ )
dist[j] = infinite;
Q.push( c[i] );
dist[ c[i] ] = 0;
inQueue[ c[i] ] = true;
while ( !Q.empty() ) {
int node = Q.front();
Q.pop();
inQueue[ node ] = false;
for ( unsigned int l = 0; l < G[node].size(); l++ ) {
edge e = G[node][l];
if ( dist[ node ] + e.len < dist[ e.to ] ) {
dist[ e.to ] = dist[node] + e.len;
if ( !inQueue[ e.to ] ) {
Q.push( e.to );
inQueue[ e.to ] = true;
}
}
}
}
for ( int j = 0; j <= k+1; j++ ) {
a[ i ][ j ] = dist[ c[j] ];
//fout << a[ i ][ j ] << " ";
}
//fout << "\n";
}
}
void Solve () {
BellmanFord();
fout << Back( 1, 0, 0 );
}
void read () {
fin >> n >> m;
fin >> k;
for ( int i = 1; i <= k; i++ )
fin >> c[i];
c[0] = 1;
c[ k+1 ] = n;
int from, to, len;
for ( int i = 1; i <= m; i++ ) {
fin >> from >> to >> len;
G[from].push_back( make_edge( to, len ) );
G[to].push_back ( make_edge( from, len) );
}
}
int main()
{
read();
Solve();
return 0;
}