Cod sursa(job #2956291)

Utilizator smunteanuMunteanu Stefan Catalin smunteanu Data 18 decembrie 2022 22:23:55
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
#include <bits/stdc++.h>
using namespace std;

const int nmax = 1e4 + 7;
const int mmax = 1e4 + 7;
const int maxnodes = nmax + mmax;
const int maxedges = maxnodes * 2;

struct Edge {
  int u, v;
  int pid;
  bool c;
};

int n, m, k, s, d;
int node[maxnodes];
bool vis[maxnodes];
int par[maxnodes];
Edge e[maxedges];
vector<int> adj[maxnodes];

void bfs() {

  memset(vis, 0, sizeof(vis));

  queue<int> q;
  q.push(0);
  vis[0] = true;

  while (!q.empty()) {
    int u = q.front(); q.pop();
    for (int eid : adj[u]) {
      const auto& [u, v, pid, c] = e[eid];
      if (c && !vis[v]) {
        par[v] = eid;
        vis[v] = true;
        if (v != d) q.push(v);
      }
    }
  }
}

void solve() {
  
  int edges = 0;

  cin >> n >> m >> k;
  s = 0, d = n + m + 1;

  for (int i = 0; i < k; i++) {
    int u, v;
    cin >> u >> v;
    e[edges] = {u, v + n, edges + 1, 1};
    e[edges + 1] = {v + n, u, edges, 0};
    adj[u].push_back(edges);
    adj[v + n].push_back(edges + 1);
    edges += 2;
  }

  for (int u = 1; u <= n; u++) {
    node[u] = u;
    e[edges] = {s, u, edges + 1, 1};
    e[edges + 1] = {u, s, edges, 0};
    adj[s].push_back(edges);
    adj[u].push_back(edges + 1);
    edges += 2;
  }

  for (int v = 1; v <= m; v++) {
    node[v + n] = v;
    e[edges] = {v + n, d, edges + 1, 1};
    e[edges + 1] = {d, v + n, edges, 0};
    adj[v + n].push_back(edges);
    adj[d].push_back(edges + 1);
    edges += 2;
  }

  int totalFlow = 0;

  for (;;) {

    bfs();

    if (!vis[d]) break;

    for (int eid : adj[d]) {
      
      const auto& [d, v, pid, c] = e[eid];

      if (!vis[v] || c) continue;

      bool currentFlow = true;

      par[d] = e[eid].pid;

      for (int u = d; u != s; u = e[par[u]].u) {
        currentFlow &= e[par[u]].c;
      }

      if (!currentFlow) continue;

      for (int u = d; u != s; u = e[par[u]].u) {
        e[par[u]].c = false;
        e[e[par[u]].pid].c = true;
      }

      totalFlow++;

    }

  }

  cout << totalFlow << endl;

  for (int u = 1; u <= n; u++) {
    for (int eid : adj[u]) {
      if (e[eid].v != s && !e[eid].c) {
        cout << u << ' ' << node[e[eid].v ]<< '\n';
        break;
      }
    }
  }






}

int main() {

  #ifdef LOCAL
  freopen("file.in", "r", stdin);
  #else
  freopen("cuplaj.in", "r", stdin);
  freopen("cuplaj.out", "w", stdout);
  #endif

  ios_base::sync_with_stdio(false), cin.tie(NULL);

  solve();
}