Cod sursa(job #1014139)

Utilizator cahemanCasian Patrascanu caheman Data 22 octombrie 2013 10:10:37
Problema Cuplaj maxim in graf bipartit Scor 4
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<cstdio>
#include<vector>
#include<cstring>

using namespace std;

vector <int> muchii[10005];
vector <int> :: iterator it;
bool viz[10005];
int left[10005], right[10005];

int matrimoniale(int nod)
{
  if(viz[nod])
    return 0;
  viz[nod] = 1;
  for(it = muchii[nod].begin(); it != muchii[nod].end(); ++ it)
    if(! right[*it])
    {
      left[nod] = *it;
      right[*it] = nod;
      return 1;
    }
  for(it = muchii[nod].begin(); it != muchii[nod].end(); ++ it)
    if(matrimoniale(right[*it]))
    {
      left[nod] = *it;
      right[*it] = nod;
      return 1;
    }
  return 0;
}

int main()
{
  freopen("cuplaj.in", "r", stdin);
  freopen("cuplaj.out", "w", stdout);
  int n, m, muc, i, x, y, contor = 1, cuplaj = 0;
  scanf("%d%d%d", &n, &m, &muc);
  for(i = 1; i <= muc; ++ i)
  {
    scanf("%d%d", &x, &y);
    muchii[x].push_back(y);
  }
  while(contor)
  {
    contor = 0;
    memset(viz, 0, sizeof(viz));
    for(i = 1; i <= n; ++ i)
      if(! left[i] && matrimoniale(i))
        contor = 1;
  }
  for(i = 1; i <= n; ++ i)
    if(left[i])
      ++ cuplaj;
  printf("%d\n", cuplaj);
  for(i = 1; i <= n; ++ i)
    if(left[i])
      printf("%d %d\n", i, left[i]);
  return 0;
}