DuongNhi99

FMATCH

Dec 9th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.06 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4.  
  5. const int N = 150007;
  6. const int INF = 1e7;
  7.  
  8. int m, n, p;
  9. vector<int> g[2 * N];
  10. int match[N], dist[N];
  11.  
  12. bool bfs() {
  13.     queue<int> q;
  14.     for(int i = 1; i <= n; i++) {
  15.         if(match[i] == 0) {
  16.             dist[i] = 0;
  17.             q.push(i);
  18.         }
  19.         else dist[i] = INF;
  20.     }
  21.  
  22.     dist[0] = INF;
  23.     while(!q.empty()) {
  24.         int u = q.front();
  25.         q.pop();
  26.         if(u == 0) continue;
  27.  
  28.         for(int v : g[u]) {
  29.             if(dist[match[v]] == INF) {
  30.                 dist[match[v]] = dist[u] + 1;
  31.                 q.push(match[v]);
  32.             }
  33.         }
  34.     }
  35.     return dist[0] < INF;
  36. }
  37.  
  38. bool dfs(int u) {
  39.     if(u == 0) return true;
  40.  
  41.     for(int v : g[u]) {
  42.         if(dist[match[v]] == dist[u] + 1) {
  43.             if(dfs(match[v])) {
  44.                 match[v] = u;
  45.                 match[u] = v;
  46.                 return true;
  47.             }
  48.         }
  49.     }
  50.  
  51.     dist[u] = INF;
  52.     return false;
  53. }
  54.  
  55. int matching() {
  56.     int ans = 0;
  57.  
  58.     while(bfs())
  59.         for(int i = 1; i <= n; i++)
  60.             if(match[i] == 0)
  61.                 ans += dfs(i);
  62.     return ans;
  63. }
  64.  
  65. int32_t main() {
  66.     freopen("in.txt", "r", stdin);
  67.     //freopen("FMATCH.inp", "r", stdin);
  68.     //freopen("FMATCH.out", "w", stdout);
  69.     ios_base::sync_with_stdio(false);
  70.     cin.tie(NULL); cout.tie(NULL);
  71.  
  72.     cin >> n >> m >> p;
  73.     for(int i = 1; i <= p; ++i) {
  74.         int u, v; cin >> u >> v;
  75.         g[u].push_back(v + n);
  76.         g[v + n].push_back(u);
  77.     }
  78.  
  79.     cout << matching() << '\n';
  80.  
  81.     return 0;
  82. }
  83. /*
  84. #include <bits/stdc++.h>
  85. #define int long long
  86. using namespace std;
  87.  
  88. const int N = 50005;
  89. const int INF = 1e7;
  90.  
  91. int m, n, p;
  92. vector<int> g[N];
  93. int matx[N], maty[N];
  94. int dist[N];
  95.  
  96. bool BFS() {
  97.     queue<int> q;
  98.     while(!q.empty())
  99.         q.pop();
  100.  
  101.     for(int i = 1; i <= m; ++i) {
  102.         if(!matx[i]) {
  103.             dist[i] = 0;
  104.             q.push(i);
  105.         }
  106.         else dist[i] = INF;
  107.     }
  108.  
  109.     dist[0] = INF;
  110.     while(!q.empty()) {
  111.         int u = q.front();
  112.         q.pop();
  113.  
  114.         if(dist[u] < dist[0])
  115.             for(int v : g[u]) {
  116.                 if(dist[maty[v]] >= INF) {
  117.                     dist[maty[v]] = dist[u] + 1;
  118.                     q.push(maty[v]);
  119.                 }
  120.             }
  121.     }
  122.  
  123.     return dist[0] < INF;
  124. }
  125.  
  126. bool DFS(const int &u) {
  127.     if(u == 0) return true;
  128.  
  129.     for(int v : g[u]) {
  130.         if(dist[maty[v]] == dist[u] + 1)
  131.             if(DFS(maty[v])) {
  132.                 matx[u] = v;
  133.                 maty[v] = u;
  134.                 return true;
  135.             }
  136.     }
  137.     dist[u] = INF;
  138.  
  139.     return false;
  140. }
  141.  
  142. void fastmatching() {
  143.     fill(matx + 1, matx + m + 1, 0);
  144.     fill(maty + 1, maty + n + 1, 0);
  145.  
  146.     int res = 0;
  147.     while(BFS()) {
  148.         for(int i = 1; i <= m; ++i)
  149.             if(!matx[i])
  150.                 res += DFS(i);
  151.     }
  152.  
  153.     cout << res << '\n';
  154. }
  155.  
  156. int32_t main() {
  157.     //freopen("in.txt", "r", stdin);
  158.     //freopen("FMATCH.inp", "r", stdin);
  159.     //freopen("FMATCH.out", "w", stdout);
  160.     ios_base::sync_with_stdio(false);
  161.     cin.tie(NULL); cout.tie(NULL);
  162.  
  163.     cin >> m >> n >> p;
  164.     for(int i = 1; i <= p; ++i) {
  165.         int u, v; cin >> u >> v;
  166.         g[u].push_back(v);
  167.     }
  168.  
  169.     fastmatching();
  170.     return 0;
  171. }
  172. */
  173.  
Add Comment
Please, Sign In to add comment