Advertisement
Guest User

Untitled

a guest
May 25th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. constexpr int ms = 113;
  6. constexpr int inf = 0x3f3f3f3f; // constante pra infinito..
  7. int mat[ms][ms];
  8. int calc[ms][ms];
  9. int n;
  10.  
  11. // Checando se uma posicao ainda esta dentro da matriz
  12. bool valid(int x, int y) { return ( x >= 0 && x < n && y >= 0 && y < n ); }
  13.  
  14. // Direcoes em que os movimentos estao definidos
  15. vector< pair<int, int> > dirs = { {0, 1}, {0, -1}, {1, 0}, {-1,0} };
  16.  
  17.  
  18. void dijkstra()
  19. {
  20.     // vamos comecar inserindo o (0, 0)
  21.     set< tuple<int, int, int> > prioridade;
  22.  
  23.     prioridade.emplace(0, 0, 0);
  24.     // sintaxe alternativa prioridade.push_back( make_tuple(0, 0, 0 ) );
  25.     calc[0][0] = 0;
  26.  
  27.     while( !prioridade.empty() )
  28.     {
  29.         // Capturando Elemento de menor distancia
  30.         auto topo = *(prioridade.begin() );
  31.            
  32.         // Apagando esse elemento da fila de prioridade
  33.         prioridade.erase( prioridade.begin() );
  34.        
  35.         int cur_dist = get<0>( topo );
  36.         int cur_x = get<1>( topo );
  37.         int cur_y = get<2>( topo );
  38.  
  39.         // Aqui estou fazendo um loop pelo vetor de direcoes
  40.         for(const auto& dir : dirs )
  41.         {
  42.             int novo_x = cur_x + dir.first;
  43.             int novo_y = cur_y + dir.second;
  44.             // Vamos checar se nao saimos do grid
  45.            
  46.             if( valid(novo_x, novo_y) == true )
  47.             {
  48.                 // Aqui vou checar de estou 'descobrindo' uma celula com um custo menor do que ela ja tinha sido descoberta
  49.                 if( cur_dist + (mat[novo_x][novo_y] ) < calc[novo_x][novo_y] )
  50.                 {
  51.                     // Se o custo dela for != inf, significa que alguem achou um caminho ate (novo_x, novo_y),
  52.                     // Esse caminho foi inserido no nosso set, mas ele é ótimo
  53.                     // Então temos que remover a tupla ( distancia_nao_otima[ novo_x ][ novo_y ], novo_x, novo_y ) do set
  54.                     // Atualizar a distancia de [novo_x][novo_y] e inserir a tupla atualizada no nosso set..
  55.                     // É exatamente o que o código abaixo faz
  56.                     if( calc[novo_x][novo_y] != inf )
  57.                     {
  58.                         prioridade.erase( make_tuple(calc[novo_x][novo_y], novo_x, novo_y ) );
  59.                     }
  60.                     calc[novo_x][novo_y] = cur_dist + ( mat[novo_x][novo_y] );
  61.                     prioridade.emplace( calc[novo_x][novo_y], novo_x, novo_y );
  62.                 }
  63.             }
  64.         }
  65.     }
  66. }
  67.  
  68.  
  69.  
  70. int main()
  71. {
  72.     ios::sync_with_stdio( false ); cin.tie( nullptr );
  73.     cin >> n;
  74.     for(int i = 0; i < n; ++i)
  75.     {
  76.         for(int j = 0; j < n; ++j)
  77.         {
  78.             cin >> mat[i][j];
  79.             calc[i][j] = inf; // inicializando valores
  80.         }
  81.     }
  82.     dijkstra();
  83.     cout << calc[n - 1][n - 1] << endl;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement