Cod sursa(job #1965420)

Utilizator Train1Train1 Train1 Data 14 aprilie 2017 13:18:34
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <queue>
#define NMax 10001
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n, m, e, x, y, c, L[NMax], R[NMax];
vector <int> v[NMax];
bool viz[NMax];
bool PairUp(int nod) {
    if(viz[nod])
        return false;
    viz[nod] = true;
    int vSize = v[nod].size();
    for(int i = 0; i < vSize; ++i) {
        int fiu = v[nod][i];
        if(R[fiu] == 0) {
            L[nod] = fiu;
            R[fiu] = nod;
            return true;
        } else if(PairUp(R[fiu])) {
            L[nod] = fiu;
            R[fiu] = nod;
            return true;
        }
    }
    return false;
}
void cuplaj() {
    bool ok = true;
    while(ok) {
        for(int i = 1; i <= n; ++i) {
            viz[i] = false;
        }
        ok = false;
        for(int i = 1; i <= n; ++i) {
            if(L[i] == 0) {
                if(PairUp(i)) {
                    c++;
                    ok = true;
                }
            }
        }
    }
}
int main()
{
    fin>>n>>m>>e;
    for(int i = 1; i <= e; ++i) {
        fin>>x>>y;
        v[x].push_back(y);
    }
    viz[0]=true;
    cuplaj();
    fout<<c<<'\n';
    for(int i = 1; i <=n; ++i) {
        if(L[i]) {
            fout<<i<<' '<<L[i]<<'\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}