Cod sursa(job #1758099)

Utilizator crushackPopescu Silviu crushack Data 16 septembrie 2016 15:52:34
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

bool pairup(const vector<vector<int>>& graph, vector<bool>& checked,
            vector<int>& left, vector<int>& right, int node) {
  if (checked[node]) {
    return false;
  }
  checked[node] = true;

  for (int adj : graph[node]) {
    if (!right[adj]) {
      left[node] = adj;
      right[adj] = node;
      return true;
    }
  }

  for (int adj : graph[node]) {
    if (pairup(graph, checked, left, right, right[adj])) {
      left[node] = adj;
      right[adj] = node;
      return true;
    }
  }

  return false;
}

int main() {
  vector<vector<int>> graph;
  vector<bool> checked;
  vector<int> left, right;
  ifstream fin("cuplaj.in");
  ofstream fout("cuplaj.out");
  int n, m, edges;

  fin >> n >> m >> edges;

  graph.resize(n + 1);
  left.resize(n + 1);
  right.resize(m + 1);
  checked.resize(n + 1);
  for (int e = 0; e < edges; ++e) {
    int x, y;
    fin >> x >> y;
    graph[x].push_back(y);
  }

  for (bool change = true; change; ) {
    change = false;
    checked.assign(checked.size(), false);
    for (int node = 1; node <= n; ++node)
      if (!left[node]) {
        change |= pairup(graph, checked, left, right, node);
      }
  }

  int ans = 0;
  for (int i = 1; i <= n; ++ i) {
    ans += left[i] != 0;
  }

  fout << ans << "\n";
  for (int i = 1; i <= n; ++ i)
    if (left[i]) {
      fout << i << " " << left[i] << "\n";
    }


  return 0;
}