Cod sursa(job #862184)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 22 ianuarie 2013 13:13:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

const int N = 11000;

int n, m, e, l[N], r[N];
vector<int> v[N];
bool ver[N];

bool pairup(int nod) {
    ver[nod] = 1;
    int i;

    for(i = 0 ;i < v[nod].size(); ++i) if(!ver[r[v[nod][i]]])
        if(!r[v[nod][i]]) {
            r[v[nod][i]] = nod;
            l[nod] = v[nod][i];
            return true;
        }
    for(i = 0; i < v[nod].size(); ++i) if(!ver[r[v[nod][i]]])
        if(pairup(r[v[nod][i]])) {
            r[v[nod][i]] = nod;
            l[nod] = v[nod][i];
            return true;
        }
    return false;
}

int cuplaj() {
    int i, c = 0, ok = 0;

    while(!ok) {
        ok = 1;
        for(i = 1; i<=n; ++i)
            ver[i] = 0;

        for(i = 1; i<=n; ++i)
            if(!l[i] && pairup(i)) {
                ++c;
                ok = 0;
            }
    }
    return c;
}

int main() {
    int i, a, b;

    in >> n >> m >> e;

    for(i = 1; i<=e; ++i) {
        in >> a >> b;
        v[a].push_back(b);
    }

    out << cuplaj() << "\n";

    for(i = 1; i<=n; ++i)
        if(l[i])
            out << i << " " << l[i] << "\n";

    return 0;
}