Cod sursa(job #373589)

Utilizator irene_mFMI Irina Iancu irene_m Data 14 decembrie 2009 12:30:47
Problema Cuplaj maxim in graf bipartit Scor 16
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <vector>
#define MaxN 10024

using namespace std;

int N,M,st[MaxN],dr[MaxN],uz[MaxN],C,S,F;
vector <int> G[MaxN];

void cit()
{
      int E,i,x,y;
      freopen("cuplaj.in","r",stdin);
      scanf("%d%d%d",&N,&M,&E);
      for(i=1;i<=E;i++)
      {
            scanf("%d%d",&x,&y);
            G[y].push_back(x);
      }
}

int pairs(int nod)
{
      int i;
      if(uz[nod])
            return 0;

      uz[nod]=1;
      for(i=0;i<G[nod].size();i++)
            if(!dr[G[nod][i]] || pairs(G[nod][i]))
            {
                  st[nod]=G[nod][i];
                  dr[G[nod][i]]=st[nod];
                  return 1;
            }
      return 0;
}

void cuplaj()
{
      int i,sw=1;

      while(sw)
      {
            sw=0;
            memset(uz,0,sizeof(uz));
            for(i=1;i<=N;i++)
                  if(!st[i] && pairs(i))
                        sw=1;
      }
}

void afis()
{
      freopen("cuplaj.out","w",stdout);
      for(int i=1;i<=N;i++)
            if(st[i])
                  C++;
      printf("%d\n",C);
      for(int i=1;i<=N;i++)
            if(st[i])
                  printf("%d %d\n",i,st[i]);
}

int main()
{
      cit();
      cuplaj();
      afis();
      return 0;
}