Friday, March 22, 2019

[Codeforces] E. Maximize Mex

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : E. Maximize Mex
Source            : Codeforces
Category          : Graph Theory
Algorithm         : Maximum Bipartite Matching, Kuhns Algorithm
Verdict           : Accepted
Implemenatation 1
  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define ll             long long int  
  6.   
  7. static const int maxn = 5000 + 5;  
  8.   
  9. int students, clubs, days;  
  10. int potential[maxn], club[maxn], leave[maxn], gone[maxn];  
  11. vector <int> graph[maxn]; // potential --> club  
  12.   
  13. // Kuhn's Algorithm for Maximum Matching in directed graph  
  14. int Left[maxn], Right[maxn], seen[maxn];  
  15.   
  16. bool kuhn(int u)  
  17. {  
  18.       if (seen[u]) return false;  
  19.       seen[u] = 1;  
  20.       for (int v : graph[u])  
  21.       {  
  22.             if (Right[v] == -1 or kuhn(Right[v]))  
  23.             {  
  24.                   Left[u] = v;  
  25.                   Right[v] = u;  
  26.                   return true;  
  27.             }  
  28.       }  
  29.       return false;  
  30. }  
  31.   
  32. int main()  
  33. {  
  34.       ios_base::sync_with_stdio(false);  
  35.       cin.tie(nullptr);  
  36.       cout << fixed << setprecision(15);  
  37.       #ifndef ONLINE_JUDGE  
  38.             freopen("in.txt""r", stdin);  
  39.       #endif // ONLINE_JUDGE  
  40.   
  41.       cin >> students >> clubs;  
  42.       for (int i = 1; i <= students; i++) cin >> potential[i];  
  43.       for (int i = 1; i <= students; i++) cin >> club[i];  
  44.       cin >> days;  
  45.       for (int i = 1; i <= days; i++)  
  46.       {  
  47.             cin >> leave[i];  
  48.             gone[ leave[i] ] = 1;  
  49.       }  
  50.       for (int i = 1; i <= students; i++)  
  51.       {  
  52.             if (gone[i] == 0) graph[ potential[i] ].emplace_back(club[i]);  
  53.       }  
  54.       int mex = 0;  
  55.       memset(Left, -1, sizeof Left);  
  56.       memset(Right, -1, sizeof Right);  
  57.       vector <int> maximum_mex;  
  58.       for (int i = days; i >= 1; i--)  
  59.       {  
  60.             while (true)  
  61.             {  
  62.                   memset(seen, 0, sizeof seen);  
  63.                   if (kuhn(mex)) ++mex;  
  64.                   else break;  
  65.             }  
  66.             maximum_mex.emplace_back(mex);  
  67.             graph[ potential[ leave[i] ] ].emplace_back(club[ leave[i] ]);  
  68.       }  
  69.       reverse(maximum_mex.begin(), maximum_mex.end());  
  70.       for (int mex : maximum_mex) cout << mex << '\n';  
  71. }  

Implementation 2
  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define ll             long long int  
  6.   
  7. static const int maxn = 5000 + 5;  
  8.   
  9. int students, clubs, days;  
  10. int potential[maxn], club[maxn], leave[maxn], gone[maxn];  
  11. vector <int> graph[maxn]; // potential --> club  
  12.   
  13. // Kuhn's Algorithm for Maximum Matching in directed graph  
  14. int match[maxn], seen[maxn];  
  15.   
  16. bool kuhn(int u)  
  17. {  
  18.       if (seen[u]) return false;  
  19.       seen[u] = 1;  
  20.       for (int v : graph[u])  
  21.       {  
  22.             //if (seen[v]) continue;  
  23.             //seen[v] = 1;  
  24.             if (match[v] == -1 or kuhn(match[v]))  
  25.             {  
  26.                   match[v] = u;  
  27.                   return true;  
  28.             }  
  29.       }  
  30.       return false;  
  31. }  
  32.   
  33. int main()  
  34. {  
  35.       ios_base::sync_with_stdio(false);  
  36.       cin.tie(nullptr);  
  37.       cout << fixed << setprecision(15);  
  38.       #ifndef ONLINE_JUDGE  
  39.             freopen("in.txt""r", stdin);  
  40.       #endif // ONLINE_JUDGE  
  41.   
  42.       cin >> students >> clubs;  
  43.       for (int i = 1; i <= students; i++) cin >> potential[i];  
  44.       for (int i = 1; i <= students; i++) cin >> club[i];  
  45.       cin >> days;  
  46.       for (int i = 1; i <= days; i++)  
  47.       {  
  48.             cin >> leave[i];  
  49.             gone[ leave[i] ] = 1;  
  50.       }  
  51.       for (int i = 1; i <= students; i++)  
  52.       {  
  53.             if (gone[i] == 0) graph[ potential[i] ].emplace_back(club[i]);  
  54.       }  
  55.       int mex = 0;  
  56.       memset(match, -1, sizeof match);  
  57.       vector <int> maximum_mex;  
  58.       for (int i = days; i >= 1; i--)  
  59.       {  
  60.             while (true)  
  61.             {  
  62.                   memset(seen, 0, sizeof seen);  
  63.                   if (kuhn(mex)) ++mex;  
  64.                   else break;  
  65.             }  
  66.             maximum_mex.emplace_back(mex);  
  67.             graph[ potential[ leave[i] ] ].emplace_back(club[ leave[i] ]);  
  68.       }  
  69.       reverse(maximum_mex.begin(), maximum_mex.end());  
  70.       for (int mex : maximum_mex) cout << mex << '\n';  
  71. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.