Cod sursa(job #279189)

Utilizator alecmanAchim Ioan Alexandru alecman Data 12 martie 2009 18:29:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>

using namespace std;

#define INPUT "cuplaj.in"
#define OUTPUT "cuplaj.out"
#define VI vector<int>
#define pb push_back
#define CL(X) memset(X, 0, sizeof(X))

const int NMAX = 10001;

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

int N, M;
long K;
int Left[ NMAX ], Right[ NMAX ], V[ NMAX ];

VI List[ NMAX ];

void readData()
{
  int Node1, Node2;

  fscanf(fin, "%d %d %ld", &N, &M, &K);

  for(;K--;)
  {
    fscanf(fin, "%d %d", &Node1, &Node2);

    List[ Node1 ].pb(Node2);
  }
}

int pereche(int _X)
{
  if(V[ _X ]) return 0;
  V[ _X ] = 1;

  VI::iterator it;

  for(it = List[ _X ].begin(); it != List[ _X ].end(); ++it)
    if(!Right[ *it ]) { Left[ _X ] = *it, Right[ *it ] = _X; return 1; }

  for(it = List[ _X ].begin(); it != List[ _X ].end(); ++it)
    if(pereche(Right[ *it ])) { Left[ _X ] = *it, Right[ *it ] = _X; return 1; }

  return 0;
}

void solve()
{
  int ok = 1;
  int cuplaj = 0;

  while(ok)
  {
    ok = 0;
    CL(V);
    for(int i = 1; i <= N; ++i)
      if(!Left[ i ]) ok |= pereche(i);
  }

  for(int i = 1; i <= N; ++i)
    cuplaj += (Left[ i ] > 0) ? 1 : 0;
  fprintf(fout, "%d\n", cuplaj);

  for(int i = 1; i <= N; ++i)
    if(Left[ i ])
      fprintf(fout, "%d %d\n", i, Left[ i ]);
}

int main()
{
  readData();

  solve();

  fclose(fin);
  fclose(fout);

  return 0;
}