Cod sursa(job #988169)

Utilizator cbanu96Banu Cristian cbanu96 Data 22 august 2013 10:58:23
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define FILEIN "cuplaj.in"
#define FILEOUT "cuplaj.out"

using namespace std;

const int NMAX = 10003;

int N, M, E;
vector<int> A[NMAX];
bool mark[NMAX];
int L[NMAX], R[NMAX];

bool cupleaza(int nod) {
    if (mark[nod]) return 0;
    mark[nod] = true;
    for ( int i = 0; i < A[nod].size(); i++) {
        if (!R[A[nod][i]]) {
            L[nod] = A[nod][i];
            R[A[nod][i]] = nod;
            return true;
        }
    }
    for ( int i = 0; i < A[nod].size(); i++) {
        if (cupleaza(R[A[nod][i]])) {
            L[nod] = A[nod][i];
            R[A[nod][i]] = nod;
            return true;
        }
    }
    return false;
}

int main() {

    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);

    scanf("%d %d %d", &N, &M, &E);
    for ( int i = 1; i <= E; i++) {
        int x,y;
        scanf("%d %d", &x, &y);
        A[x].push_back(y);
    }

    int tmp = 1;
    while(tmp) {
        memset(mark, 0, sizeof(mark));
        tmp = 0;
        for ( int i = 1; i <= N; i++) {
            if (!L[i])
                if(cupleaza(i))
                    tmp = 1;
        }
    }
    int sol = 0;
    for ( int i = 1; i <= N; i++ ){
        if (L[i] != 0)
            sol++;
    }
    printf("%d\n", sol);
    for ( int i = 1; i <= N; i++ ){
        if (L[i] != 0)
            printf("%d %d\n", i, L[i]);
    }

    return 0;
}