Cod sursa(job #241737)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 10 ianuarie 2009 20:57:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <stdio.h>
#include <vector>
#include <bitset>
#define pb(a) push_back(a)
using namespace std;
long A,B,m,i,x,y,ok,L[10002],R[10002];
bitset <10002>mark;
vector <int>v[10002];

int newpair (int x){
    int i,K,nod;
    if (mark[x])return 0;
    mark[x]=1;K=v[x].size();
    for (i=0;i<K;++i){
        nod=v[x][i];
        if (!R[nod] || newpair(R[nod])){
           L[x]=nod;
           R[nod]=x;
           return 1;
        }
    }
return 0;
}

int main(){
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%ld %ld %ld",&A,&B,&m);
    for (;m;--m){
        scanf("%ld %ld",&x,&y);v[x].pb(y);}
    do{
       ok=0;mark.reset();
       for (i=1;i<=A;++i)
           if (!L[i])ok+=newpair(i);
    }while (ok);
    for (i=1;i<=A;++i)if (L[i])ok++;
    printf("%ld\n",ok);
    for (i=1;i<=A;++i)if (L[i])printf("%ld %ld\n",i,L[i]);
return 0;
}