Advertisement
Galebickosikasa

Untitled

Jul 14th, 2020
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
  2. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx")
  3. // #pragma comment(linker, "/stack:200000000"]
  4.  
  5. #include <iostream>
  6. #include <vector>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <unordered_set>
  10. #include <unordered_map>
  11. #include <set>
  12. #include <map>
  13. #include <queue>
  14. #include <deque>
  15. #include <bitset>
  16. #include <stack>
  17. #include <random>
  18. #include <fstream>
  19. #include <sstream>
  20. #include <chrono>
  21.  
  22. #define fi first
  23. #define se second
  24. #define pb push_back
  25. #define ll long long
  26. #define ld long double
  27. #define hm unordered_map
  28. #define pii pair<int, int>
  29. #define sz(a) (int)a.size()
  30. #define all(a) a.begin(), a.end()
  31. #define cinv(v) for (auto& x: v) cin >> x
  32. #define fr(i, n) for (int i = 0; i < n; ++i)
  33. #define fl(i, l, n) for (int i = l; i < n; ++i)
  34.  
  35. #define int ll
  36.  
  37. using namespace std;
  38.  
  39. #ifdef __LOCAL
  40. #define dbg(x) cerr << #x << " : " << x << '\n'
  41. const int maxn = 500 + 20;
  42. #else
  43. #define dbg(x)
  44. const int maxn = 500 + 20;
  45. #endif
  46.  
  47. //tg: @galebickosikasa
  48.  
  49. const ll inf = (ll) 2e9;
  50. const ld pi = asin (1) * 2;
  51. const ld eps = 1e-8;
  52. const ll mod = (ll)1e9 + 7;
  53. const ll ns = 97;
  54. const int C = 250;
  55.  
  56. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  57.  
  58. struct edge {
  59. int to, c, f;
  60. };
  61.  
  62. vector<edge> edges;
  63. vector<int> g[maxn];
  64. int it[maxn], d[maxn];
  65.  
  66. int bfs (int s, int t) {
  67. for (auto& x: d) x = inf;
  68. d[s] = 0;
  69. queue<int> a;
  70. a.push (s);
  71. while (!a.empty ()) {
  72. int v = a.front ();
  73. a.pop ();
  74. for (auto& u: g[v]) {
  75. auto& e = edges[u];
  76. if (d[e.to] == inf && e.c - e.f > 0) {
  77. d[e.to] = d[v] + 1;
  78. a.push (e.to);
  79. }
  80. }
  81. }
  82. return d[t] < inf;
  83. }
  84.  
  85. int dfs (int v, int t, int c = inf, int p = -1) {
  86. if (v == t) return c;
  87. while (it[v] < sz (g[v])) {
  88. auto& e = edges[g[v][it[v]]];
  89. if (e.to == p || e.c - e.f == 0 || d[v] + 1 != d[e.to]) {
  90. ++it[v];
  91. continue;
  92. }
  93. int delta = dfs (e.to, t, min (c, e.c - e.f), v);
  94. if (delta > 0) {
  95. auto& _e = edges[g[v][it[v]]^1];
  96. e.f += delta;
  97. _e.f -= delta;
  98. return delta;
  99. }
  100. ++it[v];
  101. }
  102. return 0;
  103. }
  104.  
  105. signed main () {
  106. ios_base::sync_with_stdio(false);
  107. cin.tie(nullptr);
  108. cout.tie(nullptr);
  109. int n, m;
  110. cin >> n >> m;
  111. fr (i, n) {
  112. while (1) {
  113. int x;
  114. cin >> x;
  115. if (!x) break;
  116. --x;
  117. x += C;
  118. g[i].pb (sz (edges));
  119. edges.pb ({x, 1, 0});
  120. g[x].pb (sz (edges));
  121. edges.pb ({i, 0, 0});
  122. }
  123. }
  124. int s = 500, t = 501;
  125. fr (i, n) {
  126. g[s].pb (sz (edges));
  127. edges.pb ({i, 1, 0});
  128. g[i].pb (sz (edges));
  129. edges.pb ({s, 0, 0});
  130. }
  131. fr (i, m) {
  132. g[i + C].pb (sz (edges));
  133. edges.pb ({t, 1, 0});
  134. g[t].pb (sz (edges));
  135. edges.pb ({i + C, 0, 0});
  136. }
  137.  
  138. while (bfs (s, t)) {
  139. while (dfs (s, t)) {}
  140. for (auto& y: it) y = 0;
  141. }
  142.  
  143. vector<pii> ans;
  144. fr (i, n) {
  145. for (auto& u: g[i]) {
  146. auto& e = edges[u];
  147. if ((u & 1) == 0 && e.f) ans.pb ({i, e.to - C});
  148. }
  149. }
  150.  
  151. cout << sz (ans) << '\n';
  152. for (auto& x: ans) {
  153. cout << x.fi + 1 << ' ' << x.se + 1 << '\n';
  154. }
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement