Cod sursa(job #474689)

Utilizator mlazariLazari Mihai mlazari Data 4 august 2010 18:40:20
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<fstream>
#include<vector>

using namespace std;

#define NMAX 10003

ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");

int n,m,e,x,y,nc,i;
int l[NMAX],r[NMAX];
vector<int> v[NMAX];
bool used[NMAX];
bool change;

bool pairup(int k) {
  unsigned int i;
  if(used[k]) return false;
  used[k]=true;
  for(i=0;i<v[k].size();++i)
   if(!r[v[k][i]]) {
     l[k]=v[k][i];
     r[v[k][i]]=k;
     return true;
   }
  for(i=0;i<v[k].size();++i)
   if(pairup(r[v[k][i]])) {
     l[k]=v[k][i];
     r[v[k][i]]=k;
     return true;
   }
  return false;
}

int main() {
  fi>>n>>m>>e;
  while(e--) {
    fi>>x>>y;
    v[x].push_back(y);
  }
  do {
    change=0;
    for(i=1;i<=n;i++) used[i]=false;
    for(i=1;i<=n;i++)
     if(!l[i])
      if(pairup(i)) change=true;
  } while(change);
  for(i=1;i<=n;++i)
   if(l[i]) ++nc;
  fo<<nc<<"\n";
  for(i=1;i<=n;++i)
   if(l[i]) fo<<i<<" "<<l[i]<<"\n";
  return 0;
}