Cod sursa(job #1172051)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 16 aprilie 2014 18:27:34
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

vector<int> V[10005];

int n1,n2,m,i,x,y,sol;

int L[10005],R[10005];

bool viz[10005],ok;

bool cuplaj(int nod) {
    if(viz[nod]==1)
        return 0;
    viz[nod]=1;
    vector<int>::iterator it;
    for(it=V[nod].begin();it!=V[nod].end();it++) {
        if(R[*it]==0) {
            R[*it]=nod;
            L[nod]=*it;
            return 1;
        }
    }
    for(it=V[nod].begin();it!=V[nod].end();it++)
        if(cuplaj(R[*it])) {
            R[*it]=nod;
            L[nod]=*it;
            return 1;
        }
    return 0;
}

int main() {
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    f>>n1>>n2>>m;
    for(i=1;i<=m;i++) {
        f>>x>>y;
        V[x].push_back(y);
    }
    do {
        ok=0;
        memset(viz,0,n1+1);
        for(i=1;i<=n1;i++)
            if(L[i]==0 && cuplaj(i)) {
                ok=1;
                sol++;
            }
    } while(ok);
    g<<sol<<"\n";
    for(i=1;i<=n1;i++)
        if(L[i]!=0)
            g<<i<<" "<<L[i]<<"\n";
    return 0;
}