Cod sursa(job #1393719)

Utilizator retrogradLucian Bicsi retrograd Data 19 martie 2015 18:39:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream>
#include<vector>
#include<cstring>

using namespace std;
typedef int var;

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

#define MAXN 10001

var L[MAXN], R[MAXN];
bool Viz[MAXN];
vector<var> G[MAXN];
var n, m;

bool match(var i) {
    if(Viz[i]) return false;
    Viz[i] = 1;

    for(auto vec : G[i]) {
        if(!R[vec]) {
            L[i] = vec;
            R[vec] = i;
            return true;
        }
    }

    for(auto vec : G[i]) {
        if(match(R[vec])) {
            L[i] = vec;
            R[vec] = i;
            return true;
        }
    }
    return false;

}


void solve() {
    bool ok = 1;

    while(ok) {
        ok = 0;

        memset(Viz, 0, sizeof(Viz));

        for(var i=1; i<=n; i++) {
            if(!L[i])
                ok |= match(i);
        }
    }
}



int main() {

    var e, a, b;

    fin>>n>>m>>e;

    while(e--) {
        fin>>a>>b;
        G[a].push_back(b);
    }

    solve();

    var count = 0;

    for(var i=1; i<=n; i++) {
        if(L[i])
            count ++;
    }
    fout<<count<<'\n';

    for(var i=1; i<=n; i++) {
        if(L[i]) {
            fout<<i<<" "<<L[i]<<'\n';
        }
    }

    return 0;
}