Cod sursa(job #1751812)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 1 septembrie 2016 22:50:11
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 10005;

int ant, n, m, k;

vector<int> g[NMAX];
bool        f[NMAX];
int         l[NMAX],
            r[NMAX];

bool match(int u) {
    if(f[u]) return false;
    f[u] = true;

    for(int v: g[u]) if(!r[v]) {
        r[v] = u;
        l[u] = v;
        return true;
    }
    for(int v: g[u]) if(match(r[v])) {
        r[v] = u;
        l[u] = v;
        return true;
    }
    return false;
}

int main(void) {
    freopen("cuplaj.in",  "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    int  x, y;
    bool flag;

    ant = 0;

    scanf("%d%d%d", &n, &m, &k);
    while(k--) {
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
    }

    do {
        flag = false;
        memset(f, 0x00, sizeof(f));

        for(int i=1; i<=n; ++i) {
            if(!l[i] && match(i)) {
                flag = true;
                ant ++;
            }
        }
    } while(flag);

    printf("%d\n", ant);
    for(int i=1; i<=n; ++i) if(l[i]) {
        printf("%d %d\n", i, l[i]);
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}