Cod sursa(job #2466385)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 1 octombrie 2019 23:23:06
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <stdio.h>
#include <string.h>
#include <vector>

using namespace std;

#define NMX 10500
#define FORI(i) for(vector<int>::iterator it= v[i].begin();it!=v[i].end();++it)

vector<int> v[NMX];
int a[NMX],b[NMX];
bool vis[NMX];

int n,m,e;

bool match(int nod)
{
  if(vis[nod])return 0;
  vis[nod]=1;
  FORI(nod)
    if(!b[*it])
    {
      b[*it]=nod;
      a[nod]=*it;
      return 1;
    }
  FORI(nod)
    if(match(b[*it]))
    {
      b[*it]=nod;
      a[nod]=*it;
      return 1;
    }
  return 0;
}

int main()
{
  freopen("cuplaj.in","r",stdin);
  freopen("cuplaj.out","w",stdout);
  scanf("%d %d %d",&n,&m,&e);
  while(e--)
  {
    int j,k;
    scanf("%d %d",&j,&k);
    v[j].push_back(k);
  }
  int cuplaj=0;
  for(int change=1;change;)
  {
    change=0;
    memset(vis,0,n);//sizeof(vis));
    for(int i=1;i<=n;i++)
      if(!a[i])
        change|=match(i);
  }
  for(int i=1;i<=n;i++)
    if(a[i]>0)cuplaj++;
  printf("%d\n",cuplaj);
  for(int i=1;i<=n;i++)
    if(a[i]>0)
      printf("%d %d\n",i,a[i]);
}