Advertisement
Guest User

ssss

a guest
Jul 23rd, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <math.h>
  4. #include <algorithm>
  5. #include <map>
  6. #include <set>
  7. #include <deque>
  8. #include <unordered_map>
  9. #include <unordered_set>
  10. #include <bitset>
  11.  
  12. std::vector<std::vector<int>> g;
  13. std::vector<bool> used;
  14. std::vector<bool> covered;
  15. std::vector<int> match;
  16.  
  17. bool try_kunn(int v) {
  18. used[v] = true;
  19. for (auto u : g[v])
  20. if (match[u] == -1 || (!used[match[u]] && try_kunn(match[u]))) {
  21. match[u] = v;
  22. return true;
  23. }
  24. return false;
  25. }
  26.  
  27. int main() {
  28. #ifdef LOCAL
  29. freopen("input.txt", "r", stdin);
  30. freopen("output.txt", "w", stdout);
  31. #endif
  32. std::iostream::ios_base::sync_with_stdio(0);
  33. std::cin.tie(0);
  34. std::cout.tie(0);
  35. int n, m, a, b;
  36. std::cin >> n >> m >> a >> b;
  37. std::vector<std::vector<char>> floor(n + 2, std::vector<char>(m + 2, '*'));
  38. int cnt = 0;
  39. for (int i = 1; i < n + 1; i++) {
  40. for (int j = 1; j < m + 1; j++) {
  41. std::cin >> floor[i][j];
  42. if (floor[i][j] == '.')
  43. cnt++;
  44. }
  45. }
  46. if (b * 2 <= a) {
  47. std::cout << b * cnt;
  48. return 0;
  49. }
  50. g.resize(n * m);
  51. std::vector<int> move_x = {0, 1, 1, 1, 0, -1, -1, -1};
  52. std::vector<int> move_y = {1, 1, 0, -1, -1, -1, 0, 1};
  53. for (int i = 1; i < n + 1; i++)
  54. for (int j = 1; j < m + 1; j++)
  55. if (floor[i][j] == '.')
  56. for (int k = 0; k < 8; k++)
  57. if (floor[i + move_x[k]][j + move_y[k]] == '.')
  58. g[(i - 1) * m + (j - 1)].push_back((i - 1 + move_x[k]) * m + (j - 1 + move_y[k]));
  59. used.resize(n * m);
  60. covered.resize(n * m);
  61. match.resize(n * m, -1);
  62. bool flag = true;
  63. while (flag) {
  64. used.assign(n * m, false);
  65. flag = false;
  66. for (int i = 0; i < n * m; i++)
  67. if (!covered[i] && try_kunn(i)) {
  68. covered[i] = true;
  69. flag = true;
  70. }
  71. }
  72. int par_cnt = 0;
  73. for (int i = 0; i < n * m; i++) {
  74. if (match[i] != -1)
  75. par_cnt += 1;
  76. }
  77. std::cout << (par_cnt / 2) * a + (cnt - par_cnt) * b;
  78. return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement