Cod sursa(job #1315332)

Utilizator retrogradLucian Bicsi retrograd Data 12 ianuarie 2015 18:56:51
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
#include<vector>
#include<algorithm>

#define MAXN 10001
using namespace std;

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

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

void read() {
    fin>>n>>m>>e;
    int a, b;
    while(e--) {
        fin>>a>>b;
        G[a].push_back(b);
    }
    L.resize(n+1, 0);
    R.resize(m+1, 0);
    VIZ.resize(n+1, 0);
}

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;
        fill(VIZ.begin(), VIZ.end(), false);
        for(int i=1; i<=n; i++) {
            if(!L[i])
                ok |= pairup(i);
        }
    }
}
int cuplaj = 0;
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);
}