Cod sursa(job #1315339)

Utilizator retrogradLucian Bicsi retrograd Data 12 ianuarie 2015 19:01:16
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<algorithm>

#define MAXN 10001
using namespace std;

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

int m, n, e;
vector<int> G[MAXN];
int L[MAXN], R[MAXN];
bool VIZ[MAXN];

void read() {
    fin>>n>>m>>e;
    int a, b;
    while(e--) {
        fin>>a>>b;
        G[a].push_back(b);
    }
}

bool pairup(int i) {

    if(VIZ[i]) return false;
    VIZ[i] = true;

    for(int t=0; t<G[i].size(); t++) {
        int vec = G[i][t];
        if(!R[vec]) {
            R[vec] = i;
            L[i] = vec;
            return true;
        }
    }

    for(int t=0; t<G[i].size(); i++) {
        int vec = G[i][t];
        if(pairup(R[vec])) {
            R[vec] = i;
            L[i] = vec;
            return true;
        }
    }

    return false;
}

void solve() {
    bool ok = 1;
    while(ok) {
        ok = 0;
        memset(VIZ, false, sizeof(VIZ));
        for(int i=1; i<=n; i++) {
            if(!L[i])
                ok |= pairup(i);
        }
    }
}
int cuplaj = 0;
inline void afis(int pas) {
    if(pas > n) fout<<cuplaj<<'\n';
    else {
        if(L[pas]>0) {
            cuplaj++;
            afis(pas+1);
            fout<<pas<<" "<<L[pas]<<'\n';
        } else {
            afis(pas+1);
        }
    }
}

int main() {
    read();
    solve();
    afis(1);
}