Cod sursa(job #2138343)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 21 februarie 2018 16:17:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 10010

using namespace std;

int n,m,e,x,y,ans;
int l[MAX],r[MAX];
vector<int> nd[MAX];
bool test,acc[MAX];
bool pairup(int nod){
  if(acc[nod])return 0;
  acc[nod]=true;
  for(auto i:nd[nod])
    if(r[i]==0){
      l[nod]=i;
      r[i]=nod;
      return 1;
    }
  for(auto i:nd[nod])
    if(pairup(r[i])){
      l[nod]=i;
      r[i]=nod;
      return 1;
    }
  return 0;
}

int main()
{
    ifstream f ("cuplaj.in");
    ofstream g ("cuplaj.out");
    f>>n>>m>>e;
    for(int i=1;i<=e;i++)f>>x>>y,nd[x].push_back(y);
    do{
      test=false;
      for(int i=1;i<=max(n,m);i++)acc[i]=false;
      for(int i=1;i<=n;i++)
        if(l[i]==0&&pairup(i))test=true;
    }while(test);
    for(int i=1;i<=n;i++)ans+=(l[i]!=0);
    g<<ans<<'\n';
    for(int i=1;i<=n;i++)
      if(l[i]!=0)g<<i<<" "<<l[i]<<'\n';
    f.close ();
    g.close ();
    return 0;
}