Cod sursa(job #1258642)

Utilizator rebound212Mihnea Savu rebound212 Data 9 noiembrie 2014 09:56:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <vector>
#include <set>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <cstring>
#include <string>
#include <cstdio>
#include <climits>

#define PII pair < int , int >
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define LL long long
#define NMAX 20
using namespace std;
int m,n,e,st[10001],dr[10001],u[10001],nr,i,x,y,cup;
vector <int> g[100091];
int cuplaj(int nod)
{
    if(u[nod]) {return 0;}
    u[nod]=1;
 for (vector < int > :: iterator it = g[nod].begin(); it != g[nod].end(); it ++)
 {
     if(cuplaj(st[*it]) || st[*it]==0 )
     {
          st[*it]=nod;
          dr[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);
  for(i=1;i<=e;i++)
  {
      scanf("%d %d",&x,&y);
      g[x].PB(y);
  }
  cup=1;
  while(cup)
    {
         cup=0;
         memset(u,0,sizeof(u));

         for(i=1;i<=n;i++)
         {
             if(dr[i]==0) {cup+=cuplaj(i);}
         }
    }
    for(i=1;i<=n;i++)
    {
        if(dr[i]) nr++;
    }
    printf("%d\n",nr);
     for(i=1;i<=n;i++)
    {
        if(dr[i])
        {
            printf("%d %d\n",i,dr[i]);
        }
    }
    return 0;
}