Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <iostream>
- #include <math.h>
- #include <algorithm>
- #include <map>
- #include <set>
- #include <deque>
- #include <unordered_map>
- #include <unordered_set>
- #include <bitset>
- std::vector<std::vector<int>> g;
- std::vector<bool> used;
- std::vector<bool> covered;
- std::vector<int> match;
- bool try_kunn(int v) {
- used[v] = true;
- for (auto u : g[v])
- if (match[u] == -1 || (!used[match[u]] && try_kunn(match[u]))) {
- match[u] = v;
- return true;
- }
- return false;
- }
- int main() {
- #ifdef LOCAL
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- std::iostream::ios_base::sync_with_stdio(0);
- std::cin.tie(0);
- std::cout.tie(0);
- int n, m, a, b;
- std::cin >> n >> m >> a >> b;
- std::vector<std::vector<char>> floor(n + 2, std::vector<char>(m + 2, '*'));
- int cnt = 0;
- for (int i = 1; i < n + 1; i++) {
- for (int j = 1; j < m + 1; j++) {
- std::cin >> floor[i][j];
- if (floor[i][j] == '.')
- cnt++;
- }
- }
- if (b * 2 <= a) {
- std::cout << b * cnt;
- return 0;
- }
- g.resize(n * m);
- std::vector<int> move_x = {0, 1, 1, 1, 0, -1, -1, -1};
- std::vector<int> move_y = {1, 1, 0, -1, -1, -1, 0, 1};
- for (int i = 1; i < n + 1; i++)
- for (int j = 1; j < m + 1; j++)
- if (floor[i][j] == '.')
- for (int k = 0; k < 8; k++)
- if (floor[i + move_x[k]][j + move_y[k]] == '.')
- g[(i - 1) * m + (j - 1)].push_back((i - 1 + move_x[k]) * m + (j - 1 + move_y[k]));
- used.resize(n * m);
- covered.resize(n * m);
- match.resize(n * m, -1);
- bool flag = true;
- while (flag) {
- used.assign(n * m, false);
- flag = false;
- for (int i = 0; i < n * m; i++)
- if (!covered[i] && try_kunn(i)) {
- covered[i] = true;
- flag = true;
- }
- }
- int par_cnt = 0;
- for (int i = 0; i < n * m; i++) {
- if (match[i] != -1)
- par_cnt += 1;
- }
- std::cout << (par_cnt / 2) * a + (cnt - par_cnt) * b;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement