Cod sursa(job #469594)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 8 iulie 2010 13:46:56
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;

#define file_in "cuplaj.in"
#define file_out "cuplaj.out"

#define nmax 11111

int n,m,e;
int viz[nmax];
int l[nmax];
int r[nmax];
vector<int> G[nmax];

void citire()
{
    freopen(file_in,"r",stdin);
    freopen(file_out,"w",stdout);

    scanf("%d %d %d", &n, &m, &e);
    int i,a,b;

    for (i=1;i<=e;++i)
    {
        scanf("%d %d", &a, &b);

        G[a].push_back(b);
    }

}

int cupleaza(int nod)
{
    if (viz[nod])
         return 0;
     viz[nod]=1;

     vector<int> :: iterator it;

     for (it=G[nod].begin();it!=G[nod].end();++it)
          if (!r[*it])
          {
              l[nod]=(*it);
              r[*it]=nod;
              return 1;
          }
      for (it=G[nod].begin();it!=G[nod].end();++it)
          if (cupleaza(r[*it]))
          {
              l[nod]=(*it);
              r[*it]=nod;
              return 1;
          }

          return 0;

}

void solve()
{
    int i,ok,nr;
    ok=1;

    while(ok)
    {
        memset(viz,0,sizeof(viz));
        ok=0;
        for (i=1;i<=n;++i)
             if (!l[i])
             {
                 if (cupleaza(i))
                     ok=1;
             }
    }

    nr=0;
    for (i=1;i<=n;++i)
         if (l[i])
              nr++;
              printf("%d\n", nr);
    for (i=1;i<=n;++i)
          if (l[i])
               printf("%d %d\n", i, l[i]);
}

int main()
{
    citire();
    solve();

    fclose(stdin);
    fclose(stdout);

    return 0;
}