Advertisement
wym1111

Untitled

Aug 2nd, 2024
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. using ll = long long;
  5. #define endl '\n'
  6. const int N = 1e2 + 10;
  7. const int INF = 0x3f3f3f3f;
  8.  
  9. class Dinic {
  10. private:
  11.     struct Edge {
  12.         int v, nxt, cap, flow;
  13.     } e[N * N];
  14.     int fir[N], cnt = 0;
  15.     int dep[N], cur[N];
  16.     ll maxflow = 0;
  17.     int S, T;
  18. public:
  19.     void init (int s, int t) {
  20.         S = s;
  21.         T = t;
  22.         memset(fir, -1, sizeof fir);
  23.         cnt = 0;
  24.     }
  25.     void addEdge (int u, int v, int c) {
  26.         e[cnt] = {v, fir[u], c, 0};
  27.         fir[u] = cnt ++;
  28.         e[cnt] = {u, fir[v], 0, 0};
  29.         fir[v] = cnt ++;
  30.     }
  31.     int bfs () {
  32.         queue<int> q;
  33.         memset(dep, 0, sizeof dep);
  34.         dep[S] = 1;
  35.         q.push(S);
  36.         while (!q.empty()) {
  37.             int x = q.front();
  38.             q.pop();
  39.             for (int i = fir[x]; ~i; i = e[i].nxt) {
  40.                 int y = e[i].v;
  41.                 if (!dep[y] && e[i].cap > e[i].flow) {
  42.                     dep[y] = dep[x] + 1;
  43.                     q.push(y);
  44.                 }
  45.             }
  46.         }
  47.         return dep[T];
  48.     }
  49.     int dfs (int x, int flow) {
  50.         if (x == T || flow == 0) return flow;
  51.         int res = 0;
  52.         for (int i = cur[x]; ~i; i = e[i].nxt) {
  53.             int y = e[i].v;
  54.             if (dep[y] == dep[x] + 1) {
  55.                 int d = dfs(y, min(flow - res, e[i].cap - e[i].flow));
  56.                 res += d;
  57.                 e[i].flow += d;
  58.                 e[i ^ 1].flow -= d;
  59.                 if (res == flow) return res;
  60.             }
  61.         }
  62.         return res;
  63.     }
  64.     int dinic () {
  65.         while (bfs()) {
  66.             memcpy(cur, fir, sizeof cur);
  67.             maxflow += dfs(S, INF);
  68.         }
  69.         return maxflow;
  70.     }
  71.     void print() {
  72.         for (int x = 1; x < S; x ++) {
  73.             for (int i = cur[x]; ~i; i = e[i].nxt) {
  74.                 int y = e[i].v;
  75.                 if(y < S && e[i].flow > 0) {
  76.                     cout << x << ' ' << y << endl;
  77.                 }
  78.             }
  79.         }
  80.     }
  81. };
  82. Dinic dinic;
  83.  
  84. int n, m;
  85.  
  86. void solve() {
  87.     cin >> m >> n;
  88.     int s = n + 1, t = n + 2;
  89.     dinic.init(n + 1, n + 2);
  90.     for (int i = 1; i <= n; i ++) {
  91.         if (i <= m) dinic.addEdge(s, i, 1);
  92.         else dinic.addEdge(i, t, 1);
  93.     }
  94.     while (1) {
  95.         int u, v;
  96.         cin >> u >> v;
  97.         if (u == - 1 && v == -1) break;
  98.         dinic.addEdge(u, v, 1);
  99.     }
  100.     cout << dinic.dinic() << endl;
  101.     dinic.print();
  102. }
  103.  
  104. signed main() {
  105.     ios::sync_with_stdio(false);
  106.     cin.tie(0), cout.tie(0);
  107.     int _ = 1;
  108. //  cin >> _;
  109.     while (_--){
  110.         solve();
  111.     }
  112.     return 0;
  113. }
Tags: dinic
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement