Cod sursa(job #969284)

Utilizator ericptsStavarache Petru Eric ericpts Data 3 iulie 2013 23:37:16
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

const int MAX_N = 2*10100;

int N,M;

bool taken[MAX_N];
int mate[MAX_N];

vector<int> G[MAX_N];

bool match(const int nod)
{
    if(taken[nod])
        return 0;

    taken[nod] = 1;

    for(auto it : G[nod])
    if(!mate[it]){
        taken[it] = 1;
        mate[nod] = it;
        mate[it] = nod;
        return 1;
    }

    for(auto it : G[nod])
    if(match(mate[it])){
        mate[it] = nod;
        mate[nod] = it;
        return 1;
    }

    return 0;


}

int main()
{
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);

    int E;
    scanf("%d%d%d",&N,&M,&E);

    int x,y;

    while(E--){
        scanf("%d%d",&x,&y);
        y += N+1;

        G[x].push_back(y);
        G[y].push_back(x);
    }

    int i,changeth = 1;

    while(changeth){

        changeth = 0;

        memset(taken,0,sizeof(taken));

        for(i = 1 ; i <= N ; ++ i)
            if(!mate[i])
                changeth += match(i);

    }

    changeth = 0;

    for(i = 1 ; i <= N ; ++ i)
        changeth += mate[i] > 0;

    printf("%d\n",changeth);

    for(i = 1 ; i <= N ; ++ i)
        if(mate[i])
        printf("%d %d\n",i,mate[i]-N-1);

    return 0;
}