Cod sursa(job #1268621)

Utilizator bogdanpaunFMI Paun Bogdan Gabriel bogdanpaun Data 21 noiembrie 2014 09:47:38
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int n , m , k,i,j,x,y   ;
#define N 10005
int l[N],r[N];
vector<int> v[N];
bool viz[N];

bool pairup(int q){
    if( viz[q] ) return 0;
    viz[q] = true;
    for( vector<int> :: iterator it = v[q].begin(); it != v[q].end(); ++it )
      if(!r[*it]){
        l[q] = *it;
        r[*it] = q;
        return 1;
    }
    for( vector<int> :: iterator it = v[q].begin(); it != v[q].end(); ++it )
    if( pairup( r[*it] ) ){
        l[q] = *it;
        r[*it] = q;
        return 1;
    }
    return 0;
}


int main()
{
    freopen("cuplaj.in" , "r" ,stdin  );
    freopen("cuplaj.out", "w" ,stdout );
    scanf("%d %d %d\n", &n , &m , &k);
    for(i=1;i<=k;++i){
        scanf("%d %d\n",&x,&y);
        v[x].push_back(y);
    }
    for(int ok=1; ok ; ){
        ok = 0;
        memset(viz,0,sizeof(viz));
        for(i=1;i<=n;++i)
        if( !l[i] ) ok |= pairup( i );
    }
    int cuplaj=0;
    for(i=1;i<=n;++i)
        cuplaj += ( l[i] > 0 );
    printf("%d\n",cuplaj);
    for(i=1;i<=n;++i)
        if( l[i] > 0 )
           printf("%d %d\n",i,l[i]);


    return 0;
}