Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <algorithm>
- #define KONJ 42 - 42
- using namespace std;
- int T, N, K;
- int mat[250][250];
- int niz[1050];
- int memo[1050][201][201];
- bool visited[1050][201][201];
- void floyd(){
- for ( int k = 0; k < N; ++k )
- for ( int i = 0; i < N; ++i )
- for ( int j = 0; j < N; ++j )
- mat[i][j] = min( mat[i][j], mat[i][k] + mat[k][j] );
- }
- int rek( int pos, int a, int b ){
- if ( pos == K - 1 ){ return 0; }
- if ( visited[pos][a][b] ){ return memo[pos][a][b]; }
- int city = niz[ pos + 1 ];
- int A = mat[ niz[ pos ] ][ city ] + rek( pos + 1, a, b );
- int B = mat[ a ][ city ] + rek( pos + 1, niz[ pos ], b );
- int C = mat[ b ][ city ] + rek( pos + 1, a, niz[ pos ] );
- visited[pos][a][b] = true;
- return memo[pos][a][b] = min( A, min( B, C ) );
- }
- void solve(){
- scanf( "%d%d", &N, &K );
- for ( int i = 0; i < N; ++i ){
- for ( int j = 0; j < N; ++j ){ scanf( "%d", &mat[i][j] ); }
- }
- floyd();
- for ( int i = 0; i < K; ++i ){
- scanf( "%d", &niz[i] ); --niz[i];
- }
- memset( visited, 0, sizeof( visited ) );
- int A = mat[ 0 ][ niz[0] ] + rek( 0, 1, 2 );
- int B = mat[ 1 ][ niz[0] ] + rek( 0, 0, 2 );
- int C = mat[ 2 ][ niz[0] ] + rek( 0, 1, 0 );
- printf( "%d\n", min( A, min( B, C ) ) );
- }
- int main( void ){
- scanf( "%d", &T );
- for ( int i = 0; i < T; ++i ){ solve(); }
- return KONJ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement