Cod sursa(job #1922882)

Utilizator DanyBvGeorge-Daniel Gagiu DanyBv Data 10 martie 2017 19:24:48
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>

#define NMAX 10007

using namespace std;

int N, M, E, nr;
int L[NMAX], R[NMAX];
vector<int> G[NMAX];
bitset<NMAX> V;

void clearV()
{
    for(int i = 0; i <= N; i++)
        V[i] = 0;
}

int cuplaj(int nod)
{
    if(V[nod]) return 0;
    V[nod] = 1;
    for(int i = 0; i < G[nod].size(); ++i)
    {
        int nnod = G[nod][i];
        if(R[nnod] && !cuplaj(R[nnod])) continue;
        L[nod ] = nnod;
        R[nnod] = nod ;
        return 1;
    }
    return 0;
}

int main()
{
    freopen("cuplaj.in" , "r", stdin );
    freopen("cuplaj.out", "w", stdout);
    scanf("%d %d %d", &N, &M, &E);
    for(int i = 0; i < E; i++)
    {
        int x, y;
        scanf("%d %d", &x, &y);
        G[x].push_back(y);
    }
    int ok = 1;
    while(ok)
    {
        ok = 0;
        clearV();
        for(int i = 1; i <= N; i++)
            if(!L[i] && cuplaj(i))
            {
                ok = 1;
                nr++;
            }
    }
    printf("%d\n", nr);
    for(int i = 1; i <= N; i++)
        if(L[i])
            printf("%d %d\n", i, L[i]);
    return 0;
}