Advertisement
Guest User

Untitled

a guest
May 26th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3.  
  4. #define KONJ 42 - 42
  5.  
  6. using namespace std;
  7.  
  8. int T, N, K;
  9. int mat[250][250];
  10. int niz[1050];
  11. int memo[1050][201][201];
  12. bool visited[1050][201][201];
  13.  
  14. void floyd(){
  15. for ( int k = 0; k < N; ++k )
  16. for ( int i = 0; i < N; ++i )
  17. for ( int j = 0; j < N; ++j )
  18. mat[i][j] = min( mat[i][j], mat[i][k] + mat[k][j] );
  19. }
  20.  
  21. int rek( int pos, int a, int b ){
  22.  
  23. if ( pos == K - 1 ){ return 0; }
  24. if ( visited[pos][a][b] ){ return memo[pos][a][b]; }
  25.  
  26. int city = niz[ pos + 1 ];
  27. int A = mat[ niz[ pos ] ][ city ] + rek( pos + 1, a, b );
  28. int B = mat[ a ][ city ] + rek( pos + 1, niz[ pos ], b );
  29. int C = mat[ b ][ city ] + rek( pos + 1, a, niz[ pos ] );
  30.  
  31. visited[pos][a][b] = true;
  32. return memo[pos][a][b] = min( A, min( B, C ) );
  33.  
  34. }
  35.  
  36. void solve(){
  37.  
  38. scanf( "%d%d", &N, &K );
  39. for ( int i = 0; i < N; ++i ){
  40. for ( int j = 0; j < N; ++j ){ scanf( "%d", &mat[i][j] ); }
  41. }
  42.  
  43. floyd();
  44. for ( int i = 0; i < K; ++i ){
  45. scanf( "%d", &niz[i] ); --niz[i];
  46. }
  47.  
  48. memset( visited, 0, sizeof( visited ) );
  49. int A = mat[ 0 ][ niz[0] ] + rek( 0, 1, 2 );
  50. int B = mat[ 1 ][ niz[0] ] + rek( 0, 0, 2 );
  51. int C = mat[ 2 ][ niz[0] ] + rek( 0, 1, 0 );
  52.  
  53. printf( "%d\n", min( A, min( B, C ) ) );
  54.  
  55. }
  56.  
  57. int main( void ){
  58.  
  59. scanf( "%d", &T );
  60. for ( int i = 0; i < T; ++i ){ solve(); }
  61.  
  62. return KONJ;
  63.  
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement