ProgMe

Painting

Jun 14th, 2023
864
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. #define int int16_t
  3.  
  4. const int kN = 71;
  5. const int kNN = kN * kN + 1;
  6.  
  7. std::string s[kN];
  8. std::vector<int> G[kNN];
  9. int c[kNN][kNN];
  10. int p[kNN];
  11. bool used[kNN];
  12.  
  13. int32_t main() {
  14.     int n, m;
  15.     std::cin >> n >> m;
  16.     int w, b, g;
  17.     std::cin >> w >> b >> g;
  18.     for (int i = 0; i < n; ++i)
  19.         std::cin >> s[i];
  20.     const int N = n * m + 2;
  21.     int from = 0;
  22.     int to = m * n + 1;
  23.     for (int i = 0; i < n; ++i) {
  24.         for (int j = 0; j < m; ++j) {
  25.             int cur_num = i * m + j + 1;
  26.             if (s[i][j] == 'W') {
  27.                 G[from].push_back(cur_num);
  28.                 c[from][cur_num] = b;
  29.                 G[cur_num].push_back(from);
  30.             } else {
  31.                 G[to].push_back(cur_num);
  32.                 c[cur_num][to] = w;
  33.                 G[cur_num].push_back(to);
  34.             }
  35.             if (i + 1 < n) {
  36.                 int d_num = (i + 1) * m + j + 1;
  37.                 G[cur_num].push_back(d_num);
  38.                 c[cur_num][d_num] = g;
  39.                 G[d_num].push_back(cur_num);
  40.                 c[d_num][cur_num] = g;
  41.             }
  42.             if (j + 1 < m) {
  43.                 int r_num = i * m + j + 2;
  44.                 G[cur_num].push_back(r_num);
  45.                 c[cur_num][r_num] = g;
  46.                 G[r_num].push_back(cur_num);
  47.                 c[r_num][cur_num] = g;
  48.             }
  49.         }
  50.     }
  51.     int32_t ans = 0;
  52.     std::fill(p, p + N, -1);
  53.     while (true) {
  54.         std::fill(used, used + N, false);
  55.         std::fill(p, p + N, -1);
  56.         std::queue<int> q;
  57.         q.push(from);
  58.         used[from] = true;
  59.         while(!q.empty()){
  60.             int v = q.front();
  61.             q.pop();
  62.             for (int nxt : G[v])
  63.                 if (!used[nxt] && c[v][nxt] > 0) {
  64.                     p[nxt] = v;
  65.                     used[nxt] = true;
  66.                     q.push(nxt);
  67.                 }
  68.         }
  69.         if (!used[to])
  70.             break;
  71.         int cur = std::numeric_limits<int>::max();
  72.         for (int i = to; p[i] != -1; i = p[i]) {
  73.             int f = p[i];
  74.             int st = i;
  75.             cur = std::min(cur, c[f][st]);
  76.         }
  77.         ans += cur;
  78.         for (int i = to; p[i] != -1; i = p[i]) {
  79.             int f = p[i];
  80.             int st = i;
  81.             c[f][st] -= cur;
  82.             c[st][f] += cur;
  83.         }
  84.     }
  85.     std::cout << ans;
  86. }
Tags: max-flow
Advertisement
Add Comment
Please, Sign In to add comment