Cod sursa(job #1339495)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 10 februarie 2015 22:29:07
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int n, m, e, i, x, y, ok, nr, L[100010], R[100010], v[100010];
vector <int> A[100010];
int cuplaj(int nod){
    v[nod] = 1;
    for(int i = 0; i < A[nod].size(); i ++)
        if(R[A[nod][i]] == 0)
        {
            L[nod] = A[nod][i];
            R[A[nod][i]] = nod;
            return 1;
        }
    for(int i = 0; i < A[nod].size(); i ++)
        if(v[R[A[nod][i]]] == 0 && cuplaj(R[A[nod][i]]))
        {
            L[nod] = A[nod][i];
            R[A[nod][i]] = nod;
            return 1;
        }
    return 0;
}
int main()
{
    fin >> n >> m >> e;
    for(i = 1; i <= e; i ++)
    {
        fin >> x >> y;
        A[x].push_back(y);
    }
    do
    {
        for(i = 1; i <= n; i ++)
            v[i] = 0;
        ok = 0;
        for(i = 1; i <= n; i ++)
            if(L[i] == 0)
                if(cuplaj(i))
                {
                 ok = 1;
                 nr ++;
                }
    }while(ok);
    fout << nr << '\n';
    for(i = 1; i <= n; i ++)
        if(L[i] != 0)
            fout << i << " " << L[i] << '\n';

    return 0;
}