Pagini recente » Cod sursa (job #19035) | Cod sursa (job #3156530) | Cod sursa (job #66817) | Cod sursa (job #48242) | Cod sursa (job #1894647)
#include <bits/stdc++.h>
using namespace std;
fstream in ( "team.in" , ios::in );
fstream out( "team.out", ios::out );
const int PMAX = 5e1 + 5;
const int NMAX = 5e2 + 5;
const int INF = 0x3f3f3f3f;
int pos[PMAX], cst[PMAX][PMAX];
int dp[PMAX][PMAX][2], dst[NMAX];
bitset<NMAX> oki;
vector<pair<int, int>> edg[NMAX];
int slv( int lft, int rgt, int val ) {
if( lft > rgt || ( lft == val && rgt == val ) )
return 0;
if( dp[lft][rgt][val > rgt] != INF )
return dp[lft][rgt][val > rgt];
for( int mid = lft; mid <= rgt; ++ mid )
dp[lft][rgt][val > rgt] = min( dp[lft][rgt][val > rgt],
cst[val][mid] + slv( lft, mid - 1, mid ) +
slv( mid + 1, rgt, mid ) );
return dp[lft][rgt][val > rgt];
}
int main( void ) {
ios::sync_with_stdio( false );
int p, n, m;
in >> p >> n >> m;
for( int i = 1; i <= m; ++ i ) {
int x, y, z;
in >> x >> y >> z;
edg[x].push_back( make_pair( y, z ) );
edg[y].push_back( make_pair( x, z ) );
}
pos[0] = 1;
for( int i = 1; i <= p; ++ i )
in >> pos[i];
for( int i = 0; i <= p; ++ i ) {
fill( dst, dst + n + 1, INF );
oki.reset(); dst[pos[i]] = 0;
for( int j = 1, x = 0; j <= n; ++ j, x = 0 ) {
for( int k = 1; k <= n; ++ k )
if( oki[k] == false && dst[k] < dst[x] )
x = k;
oki[x] = true;
for( pair<int, int> y : edg[x] )
if( dst[y.first] > dst[x] + y.second )
dst[y.first] = dst[x] + y.second;
}
for( int j = 0; j <= p; ++ j )
cst[i][j] = cst[j][i] = dst[pos[j]];
}
for( int i = 0; i < PMAX; ++ i )
for( int j = 0; j < PMAX; ++ j )
dp[i][j][0] = dp[i][j][1] = INF;
out << slv( 1, p, 0 ) << endl;
return 0;
}