Cod sursa(job #2471242)

Utilizator Leonard123Mirt Leonard Leonard123 Data 10 octombrie 2019 17:22:21
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream>
#include<cstring>
#include<vector>
using namespace std;
#define maxn 10005
#define FORI(i,v) for (vector <int>::iterator i= (v).begin();  i != (v).end();  ++i)
vector <int> v[maxn];
int l[maxn],r[maxn],u[maxn];

ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");

int pairup(int n){
  if(u[n]) return 0;
  u[n]=1;
  FORI(i,v[n])
    if(!r[*i]){
      l[n]=*i;
      r[*i]=n;
      return 1;
  }
  FORI(i,v[n])
    if(pairup(*i)){
      l[n]=*i;
      r[*i]=n;
      return 1;
    }
  return 0;
}

int main(){
  int x,y,change=1,cuplaj=0,n,m,edges;
  cin>>n>>m>>edges;
  while(edges){
    cin>>x>>y;
    v[x].push_back(y);
    edges--;
  }
  while(change){
    change=0;
    memset(u,0,sizeof(u));
    for(int i=1; i<=n; i++)
      if(!l[i])
        change|=pairup(i);
  }
  for(int i=1; i<=n; i++)
    cuplaj+=(l[i]>0);
  cout<<cuplaj<<'\n';
  for(int i=1; i<=n; i++)
    if(l[i]>0)
      cout<<i<<' '<<l[i]<<'\n';
  return 0;
}