jw910731

TIOJ 1034

Sep 13th, 2019
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <utility>
  6. #ifdef TEST
  7.     #define debug(...) printf(__VA_ARGS__)
  8. #else
  9.     #define debug(...) (void)0
  10. #endif
  11. #define EB emplace_back
  12. #define MP make_pair
  13. #define ST first
  14. #define ND second
  15. using namespace std;
  16. using ll = long long;
  17. using llu = long long unsigned;
  18. using pii = pair<int,int>;
  19. /************************/
  20. #define INF 100000000
  21. #define MXN 20
  22. int N;
  23. int grid[MXN+5][MXN+5]; // y , x
  24. pii path[MXN+5][MXN+5][MXN+5][MXN+5]; // y1, x1, y2, x2 => ST: best path, ND: Bomb best path
  25. void FloydWarshall();
  26. void Init();
  27. int main(){
  28.     int Q;
  29.     scanf("%d", &N);
  30.     for(int i = 0 ; i < N; ++i)
  31.         for(int j = 0 ; j < N ; ++j)
  32.             scanf("%d", &grid[j][i]);
  33.     Init();
  34.     FloydWarshall();
  35.     scanf("%d", &Q);
  36.     while(Q--){
  37.         pii p1, p2;
  38.         scanf("%d%d%d%d", &p1.ST, &p1.ND, &p2.ST, &p2.ND);
  39.         pii ans = path[p1.ND-1][p1.ST-1][p2.ND-1][p2.ST-1];
  40.         debug("%d %d\n", ans.ST, ans.ND);
  41.         printf("%d\n", ans.ND);
  42.     }
  43.     return 0;
  44. }
  45. void FloydWarshall(){
  46.     for(int kx = 0 ; kx < N; ++kx){
  47.         for(int ky = 0; ky < N; ++ky){
  48.             for(int ix = 0 ; ix < N ; ++ix){
  49.                 for(int iy = 0 ; iy < N ; ++iy){
  50.                     for(int jx = 0 ; jx < N ; ++jx){
  51.                         for(int jy = 0 ; jy < N ; ++jy){
  52.                             path[iy][ix][jy][jx].ST = min(path[iy][ix][jy][jx].ST, path[iy][ix][ky][kx].ST + path[ky][kx][jy][jx].ST - grid[ky][kx]);
  53.                         }
  54.                     }
  55.                 }
  56.             }
  57.         }
  58.     }
  59.     for(int kx = 0 ; kx < N; ++kx){
  60.         for(int ky = 0; ky < N; ++ky){
  61.             for(int ix = 0 ; ix < N ; ++ix){
  62.                 for(int iy = 0 ; iy < N ; ++iy){
  63.                     for(int jx = 0 ; jx < N ; ++jx){
  64.                         for(int jy = 0 ; jy < N ; ++jy){
  65.                             path[iy][ix][jy][jx].ND = min(path[iy][ix][jy][jx].ND, path[iy][ix][ky][kx].ST + path[ky][kx][jy][jx].ST - 2 * grid[ky][kx]);
  66.                         }
  67.                     }
  68.                 }
  69.             }
  70.         }
  71.     }
  72. }
  73. void Init(){
  74.     // (ix, iy) => (jx, jy)
  75.     for(int ix = 0; ix < N; ++ix)
  76.         for(int iy = 0 ; iy < N ; ++iy)
  77.             for(int jx = 0 ; jx < N ; ++jx)
  78.                 for(int jy = 0 ; jy < N; ++jy){
  79.                     path[iy][ix][jy][jx].ST = path[iy][ix][jy][jx].ND = INF;
  80.                     if(ix == jx && iy == jy){
  81.                         path[iy][ix][jy][jx].ST = grid[iy][ix];
  82.                         path[iy][ix][jy][jx].ND = 0;
  83.                     }
  84.                     if(abs(iy-jy)+abs(ix-jx) == 1){
  85.                         path[iy][ix][jy][jx].ST = grid[iy][ix] + grid[jy][jx];
  86.                         path[iy][ix][jy][jx].ND = min(grid[jy][jx], grid[iy][ix]);
  87.                     }
  88.                 }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment