Advertisement
a53

CUPLAJ_MAXIM_IN_GRAF_BIPARTIT

a53
Feb 6th, 2022
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.31 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const char iname[] = "cuplaj.in";
  7. const char oname[] = "cuplaj.out";
  8.  
  9. #define MAXN 10005
  10. #define FOR(i, a, b) for (int i = (int)(a); i <= (int)(b); ++ i)
  11. #define FORI(i, V) for (vector <int>::iterator i = (V).begin(); i != (V).end(); ++ i)
  12.  
  13. vector <int> G[MAXN];
  14.  
  15. int l[MAXN], r[MAXN], u[MAXN];
  16.  
  17.  
  18. int pairup(const int n)
  19. {
  20. if (u[n]) return 0;
  21. u[n] = 1;
  22. FORI (i, G[n]) if (!r[*i]) {
  23. l[n] = *i;
  24. r[*i] = n;
  25. return 1;
  26. }
  27. FORI (i, G[n]) if (pairup(r[*i])) {
  28. l[n] = *i;
  29. r[*i] = n;
  30. return 1;
  31. }
  32. return 0;
  33. }
  34.  
  35. int main(void)
  36. {
  37. freopen(iname, "r", stdin);
  38. freopen(oname, "w", stdout);
  39.  
  40. int n, m, cnt_edges;
  41. scanf("%d %d %d", &n, &m, &cnt_edges);
  42.  
  43. for (; cnt_edges --; )
  44. {
  45. int x, y;
  46. scanf("%d %d", &x, &y);
  47. G[x].push_back(y);
  48. }
  49. for (int change = 1; change; )
  50. {
  51. change = 0;
  52. memset(u, 0, sizeof(u));
  53. FOR (i, 1, n) if (!l[i])
  54. change |= pairup(i);
  55. }
  56. int cuplaj = 0;
  57. FOR (i, 1, n) cuplaj += (l[i] > 0);
  58. printf("%d\n", cuplaj);
  59. FOR (i, 1, n) if (l[i] > 0)
  60. printf("%d %d\n", i, l[i]);
  61.  
  62. return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement