Cod sursa(job #1414632)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 2 aprilie 2015 20:27:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
vector <int> a[10005];
int l[10005], r[10005], u[10005], n, m, e, i, x, y, sol;
bool change;
int pairup(int poz) {
    vector <int>::iterator it;
    if (u[poz])  return 0;
    u[poz] = 1;
    for (it=a[poz].begin();it!=a[poz].end();it++) if (!r[*it]) {
        l[poz] = *it;
        r[*it] = poz;
        return 1;
    }
    for (it=a[poz].begin();it!=a[poz].end();it++) if (pairup(r[*it])) {
        l[poz] = *it;
        r[*it] = poz;
        return 1;
    }
    return 0;
}

int main() {
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    scanf("%d %d %d", &n, &m, &e);
    for (i=1;i<=e;i++) {scanf("%d %d", &x, &y); a[x].push_back(y);}
    change=true;
    while (change) {
        change=false;
        memset(u, 0, sizeof(u));
        for (i=1;i<=n;i++) if (!l[i]) {if (pairup(i)==true) change=true;}
    }
    sol=0;
    for (i=1;i<=n;i++) if (l[i]>0) sol++;
    printf("%d\n", sol);
    for (i=1;i<=n;i++) if (l[i] > 0)
        printf("%d %d\n", i, l[i]);

    return 0;
}