Cod sursa(job #630647)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 6 noiembrie 2011 10:25:42
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<fstream>
#include<vector>
using namespace std;

const int N = 10001;

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

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

bool pairup(int x) {
    vector<int>::iterator it;

    if(u[x])
        return 0;

    u[x]=true;

    for(it=v[x].begin();it!=v[x].end();++it)
        if(r[*it]==0 || pairup(r[*it])) {

            l[x]=*it; r[*it]=x;
            return 1;

        }
    return 0;
}

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

    while(ok) {
        for(i=1;i<=n;++i)
            u[i]=false;

        ok=0;

        for(i=1;i<=n;++i)
            if(l[i]==0)
                if(pairup(i)) {

                    ++c;
                    ok=1;
                }
    }

    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;
}