/ SeriousOJ /

Record Detail

Compile Error

foo.cc: In function 'int dijkstra(int, int, int, int, std::vector<std::vector<char> >&)':
foo.cc:19:79: error: wrong number of template arguments (0, should be 1)
   19 |     priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<>> pq;
      |                                                                               ^
In file included from /usr/include/c++/13/string:49,
                 from /usr/include/c++/13/bits/locale_classes.h:40,
                 from /usr/include/c++/13/bits/ios_base.h:41,
                 from /usr/include/c++/13/ios:44,
                 from /usr/include/c++/13/ostream:40,
                 from /usr/include/c++/13/iostream:41,
                 from foo.cc:1:
/usr/include/c++/13/bits/stl_function.h:393:12: note: provided for 'template<class _Tp> struct std::greater'
  393 |     struct greater : public binary_function<_Tp, _Tp, bool>
      |            ^~~~~~~
foo.cc:19:80: error: template argument 3 is invalid
   19 |     priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<>> pq;
      |                                                                                ^~
foo.cc:21:8: error: request for member 'push' in 'pq', which is of non-class type 'int'
   21 |     pq.push(make_tuple(0, 0, 0));
      |        ^~~~
foo.cc:29:16: error: request for member 'empty' in 'pq', which is of non-class type 'int'
   29 |     while (!pq.empty()) {
      |                ^~~~~
foo.cc:30:39: error: request for member 'top' in 'pq', which is of non-class type 'int'
   30 |         auto [currentCost, r, c] = pq.top();
      |                                       ^~~
foo.cc:31:12: error: request for member 'pop' in 'pq', which is of non-class type 'int'
   31 |         pq.pop();
      |            ^~~
foo.cc:43:20: error: request for member 'push' in 'pq', which is of non-class type 'int'
   43 |                 pq.push(make_tuple(cost[new_row][new_col], new_row, new_col));
      |                    ^~~~
foo.cc:53:20: error: request for member 'push' in 'pq', which is of non-class type 'int'
   53 |                 pq.push(make_tuple(cost[new_row][new_col], new_row, new_col));
      |                    ^~~~

Code

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <tuple>

using namespace std;

struct Point {
    int row, col;
};

bool isValid(int row, int col, int N, int M, vector<vector<char>> &grid, vector<vector<int>> &cost) {
    return row >= 0 && row < N && col >= 0 && col < M && grid[row][col] != '#' && cost[row][col] == INT_MAX;
}

int dijkstra(int N, int M, int x, int y, vector<vector<char>> &grid) {
    vector<vector<int>> cost(N, vector<int>(M, INT_MAX));
    priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<>> pq;

    pq.push(make_tuple(0, 0, 0));
    cost[0][0] = 0;

    // Directions for straight and L-shaped pipes
    vector<int> dr = {1, 0};
    vector<int> dc = {0, 1};
    vector<pair<int, int>> lshape = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};

    while (!pq.empty()) {
        auto [currentCost, r, c] = pq.top();
        pq.pop();

        if (r == N - 1 && c == M - 1) {
            return currentCost;
        }

        // Move straight
        for (int i = 0; i < 2; ++i) {
            int new_row = r + dr[i];
            int new_col = c + dc[i];
            if (isValid(new_row, new_col, N, M, grid, cost) && currentCost + x < cost[new_row][new_col]) {
                cost[new_row][new_col] = currentCost + x;
                pq.push(make_tuple(cost[new_row][new_col], new_row, new_col));
            }
        }

        // Move L-shaped (avoiding invalid paths)
        for (auto [drL, dcL] : lshape) {
            int new_row = r + drL;
            int new_col = c + dcL;
            if (isValid(new_row, new_col, N, M, grid, cost) && currentCost + y < cost[new_row][new_col]) {
                cost[new_row][new_col] = currentCost + y;
                pq.push(make_tuple(cost[new_row][new_col], new_row, new_col));
            }
        }
    }

    return -1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int T;
    cin >> T;
    
    while (T--) {
        int N, M, x, y;
        cin >> N >> M >> x >> y;
        
        vector<vector<char>> grid(N, vector<char>(M));
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < M; ++j) {
                cin >> grid[i][j];
            }
        }
        
        int result = dijkstra(N, M, x, y, grid);
        cout << result << "\n";
    }
    
    return 0;
}

Information

Submit By
Type
Submission
Problem
P1156 Low cost water management
Contest
Happy New Year 2025
Language
C++11 (G++ 13.2.0)
Submit At
2025-01-02 16:42:55
Judged At
2025-01-02 16:42:55
Judged By
Score
0
Total Time
0ms
Peak Memory
0 Bytes