Cod sursa(job #445325)

Utilizator pantaniMarco Pantani pantani Data 23 aprilie 2010 15:39:11
Problema Cuplaj maxim in graf bipartit Scor 32
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cassert>
#include <cstdio>
#include <cstring>

#include <vector>
using namespace std;

const int MAX_N = 10000;

int n, m, edges;
vector<int> graph[MAX_N];
int cuplaj[MAX_N];
char vis[MAX_N];

int cupleaza(int leftNode) {
  if (vis[leftNode]) return 0;
  vis[leftNode] = 1;

  for (int i = 0; i < (int)graph[leftNode].size(); ++i) {
    int rightNode = graph[leftNode][i];
    if (!cuplaj[rightNode]) {
      cuplaj[rightNode] = leftNode;
      return 1;
    } else if (cupleaza(cuplaj[rightNode])) {
      cuplaj[rightNode] = leftNode;
      return 1;
    }
  }
  return 0;
}

void write() {
  int cnt = 0;
  for (int i = 1; i <= m; ++i)
    cnt += cuplaj[i] != 0;

  printf("%d\n", cnt);
  for (int i = 1; i <= m; ++i)
    printf("%d %d\n", cuplaj[i], i);
}

int main() {
  assert(freopen("cuplaj.in", "r", stdin) != NULL);
  assert(freopen("cuplaj.out", "w", stdout) != NULL);

  assert(scanf("%d %d %d", &n, &m, &edges) == 3);
  for (int i = 0; i < edges; ++i) {
    int a, b;
    assert(scanf("%d %d", &a, &b) == 2);
    graph[a].push_back(b);
  }

  for (int i = 1; i <= n; ++i) {
    memset(vis, 0, sizeof(vis));
    cupleaza(i);
  }

  write();
}