Advertisement
Korotkodul

21-22_N5_v2

Mar 24th, 2023 (edited)
872
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. #include <string>
  5. #include <algorithm>
  6. #include <set>
  7. using namespace std;
  8.  
  9. #define pb push_back
  10.  
  11. bool sh = 1;
  12.  
  13.  
  14.  
  15. map <char, vector <char> > G;
  16. map <char, int> clr;
  17. set <char> all_char;
  18.  
  19. void check() {
  20.     cout << "CHECK\n";
  21.     cout << "G\n";
  22.     for (auto p: G) {
  23.         char l = p.first;
  24.         vector <char> v = p.second;
  25.         cout << "key = " << l << "\n";
  26.         cout << "value\n";
  27.         for (char l: v) {
  28.             cout << l << ' ' ;
  29.         } cout << "\n";
  30.     }
  31.     cout << "END OF CHECK\n";
  32.     cout << "\n";
  33. }
  34.  
  35.  
  36. void unlock(char proc, char rec) {
  37.     auto pointer = find(begin(G[rec]), end(G[rec]), proc);
  38.     G[rec].erase(pointer);
  39. }
  40.  
  41. void lock(char proc, char rec) {
  42.     if (G.find(rec) == G.end()) {
  43.         G[rec] = {};
  44.     }
  45.     G[rec].pb(proc);
  46.     /*
  47.     так в mape - нормально сработает?
  48.     то есть если до этого не было ключа rec - как он сдлетаь push_back в конец вектора, к-рого не существовало?
  49.     */
  50. }
  51.  
  52.  
  53. void get_cycle(char v) {
  54.     char start = v;
  55.     vector <char> cycle = {v};
  56.     v = G[v][0];
  57.     while (v != start) {
  58.         cycle.pb(v);
  59.         v = G[v][0];
  60.     }
  61.     vector <char> ans;
  62.     for (char l: cycle) {
  63.         if (l - '0' >= 0 && l - '0' <= 9) {
  64.             ans.pb(l);
  65.         }
  66.     }
  67.     sort(ans.begin(), ans.end());
  68.     cout << "DEADLOCK\n";
  69.     for (char l: ans) {
  70.         cout << l << " ";
  71.     }
  72.     cout << "\n";
  73.     exit(0);
  74. }
  75.  
  76. void dfs(char v) {
  77.     if (sh) {
  78.         cout << "v = " << v << "\n";
  79.         cout << "clr\n";
  80.         for (auto p: clr) {
  81.             cout << p.first << ' ' << p.second << "\n";
  82.         }
  83.     }
  84.     clr[v] = 1;
  85.     for (char u: G[v]) {
  86.         if (clr[u] == 0) {
  87.             dfs(u);
  88.         }
  89.         else {
  90.             get_cycle(u);
  91.         }
  92.     }
  93.     clr[v] = 2;
  94. }
  95.  
  96. void get_ok_ans() {
  97.     int locked = 0;
  98.     for (char l: all_char) {
  99.         if (l - '0' >= 0 && l - '0' <= 9) {
  100.             continue;
  101.         }
  102.         if (G.find(l) == G.end()) {
  103.             continue;
  104.         }
  105.         if (!G[l].empty()) {
  106.             locked++;
  107.         }
  108.     }
  109.     cout << "NO DEADLOCK\n";
  110.     cout << locked << "\n";
  111. }
  112.  
  113.  
  114. int main()
  115. {
  116.  
  117.     while (1) {
  118.         char proc, rec, act;
  119.         cin >> proc;
  120.         if (proc == '.') {
  121.             break;
  122.         }
  123.         cin >> rec >> act;
  124.         all_char.insert(proc);
  125.         all_char.insert(rec);
  126.         for (char l: all_char) {
  127.             clr[l] = 0;
  128.         }
  129.         cout << "LOCKING/UNLOCKING\n";
  130.         if (act == 'L') {
  131.             lock(proc, rec);
  132.         } else {
  133.             unlock(proc, rec);
  134.         }
  135.         if (sh) {
  136.             check();
  137.         }
  138.         cout << "DFS\n";
  139.         for (char l: all_char) {
  140.             if (G.find(l) == G.end()) {
  141.                 continue;
  142.             }
  143.             if (clr[l] == 0) {
  144.                 dfs(l);
  145.             }
  146.         }
  147.  
  148.     }
  149.     get_ok_ans();
  150. }
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement