Nik_Perepelov

9 контест Ярику

Nov 17th, 2021 (edited)
1,208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. class Task {
  7.  
  8.     int n, m;
  9.     int free_cells = 0;
  10.     vector<vector<int>> g;
  11.     vector<int> parasoch;
  12.     vector<bool> used;
  13.     int parasoch_cnt = 0;
  14.  
  15.     vector<string> s;
  16. public:
  17.     Task(int _n, int _m) {
  18.         n = _n;
  19.         m = _m;
  20.         g.resize(n * m);
  21.         used.resize(n * m);
  22.         parasoch.resize(n * m, -1);
  23.         s.resize(n);
  24.  
  25.  
  26.     }
  27.  
  28.     void read_graph(){
  29.         for (auto &i: s) {
  30.             cin >> i;
  31.         }
  32.         for (int i = 0; i < n; i++) {
  33.             for (int j = 0; j < m; j++) {
  34.                 if (s[i][j] == '.')
  35.                     continue;
  36.                 free_cells++;
  37.                 if ((i + j) % 2)
  38.                     continue;
  39.  
  40.                 if (j && (s[i][j - 1] == '*'))
  41.                     g[i * m + j].push_back(i * m + j - 1);
  42.  
  43.                 if ((j < m - 1) && (s[i][j + 1] == '*'))
  44.                     g[i * m + j].push_back(i * m + j + 1);
  45.  
  46.                 if (i && (s[i - 1][j] == '*'))
  47.                     g[i * m + j].push_back((i - 1) * m + j);
  48.  
  49.                 if ((i < n - 1) && (s[i + 1][j] == '*'))
  50.                     g[i * m + j].push_back((i + 1) * m + j);
  51.             }
  52.         }
  53.     }
  54.  
  55.     bool dfs(int v) {
  56.         if (used[v])
  57.             return false;
  58.         used[v] = true;
  59.         for (int i = 0; i < g[v].size(); i++) {
  60.             int to = g[v][i];
  61.             if (parasoch[to] == -1 || dfs(parasoch[to])) {
  62.                 parasoch[to] = v;
  63.                 return true;
  64.             }
  65.         }
  66.         return false;
  67.     }
  68.  
  69.     void solve() {
  70.  
  71.  
  72.  
  73.  
  74.         for (int i = 0; i < n; i++) {
  75.             for (int j = 0; j < m; j++) {
  76.                 if ((i + j) % 2 == 1)
  77.                     continue;
  78.                 used.assign(n * m, false);
  79.                 dfs(i * m + j);
  80.             }
  81.         }
  82.         for (int i = 0; i < n * m; i++) {
  83.             if (parasoch[i] != -1) {
  84.                 parasoch_cnt++;
  85.             }
  86.         }
  87.  
  88.     }
  89.  
  90.     void print_result(int a, int b){
  91.         if (2 * b <= a) {
  92.             cout <<  free_cells * b;
  93.         }
  94.         else{
  95.             cout << parasoch_cnt * a + (free_cells - 2 * parasoch_cnt) * b;
  96.         }
  97.     }
  98. };
  99.  
  100. int main() {
  101.     int n, m, a, b;
  102.     cin >> n >> m >> a >> b;
  103.  
  104.     Task t(n, m);
  105.     t.read_graph();
  106.     t.solve();
  107.     t.print_result(a, b);
  108.  
  109.     return 0;
  110. }
  111.  
  112. // 2
  113.  
  114. #include <iostream>
  115. #include <vector>
  116.  
  117. using namespace std;
  118.  
  119. class Task {
  120.  
  121.     int n;
  122.     int free_cells = 0;
  123.     vector<vector<int>> g;
  124.     vector<int> parasoch;
  125.     vector<bool> used;
  126.  
  127.     vector<string> s;
  128.     string sister;
  129.     int is_ok = true;
  130.  
  131. public:
  132.     Task(int _n) {
  133.         n = _n;
  134.         g.resize(n);
  135.         used.resize(n);
  136.         parasoch.resize(n, -1);
  137.         s.resize(n);
  138.     }
  139.  
  140.     void read_graph() {
  141.         cin >> sister;
  142.  
  143.         for (int i = 0; i < s.size(); i++)
  144.             cin >> s[i];
  145.  
  146.         for (int i = 0; i < sister.size(); i++){
  147.             for (int j = 0; j < n; j++){
  148.                 for (int k = 0; k < 6; k++){
  149.                     if (sister[i] == s[j][k]){
  150.                         g[j].emplace_back(i);
  151.                     }
  152.                 }
  153.             }
  154.         }
  155.     }
  156.  
  157.     bool dfs(int v) {
  158.         if (used[v])
  159.             return false;
  160.         used[v] = true;
  161.         for (int i = 0; i < g[v].size(); i++) {
  162.             int to = g[v][i];
  163.             if (parasoch[to] == -1 || dfs(parasoch[to])) {
  164.                 parasoch[to] = v;
  165.                 return true;
  166.             }
  167.         }
  168.         return false;
  169.     }
  170.  
  171.     void solve() {
  172.  
  173.  
  174.         for (int i = 0; i < n; i++) {
  175.             used.assign(n, false);
  176.             dfs(i);
  177.         }
  178.  
  179.  
  180.         for (int i = 0; i < n; i++) {
  181.             if (parasoch[i] == -1) {
  182.                 is_ok = false;
  183.             }
  184.         }
  185.  
  186.     }
  187.  
  188.     void print_result() {
  189.         if (is_ok){
  190.             cout << "YES" << endl;
  191.             for (int i = 0; i < s.size(); i++){
  192.                 cout << parasoch[i] + 1 << ' ';
  193.             }
  194.         }
  195.         else
  196.             cout << "NO";
  197.     }
  198.  
  199. };
  200.  
  201. int main() {
  202.     int n;
  203.     cin >> n;
  204.  
  205.     Task t(n);
  206.     t.read_graph();
  207.     t.solve();
  208.     t.print_result();
  209.  
  210.     return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment