Cod sursa(job #2577525)

Utilizator Vlad_NituNitu Vlad-Petru Vlad_Nitu Data 9 martie 2020 16:03:23
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
#define NMAX 10010
using namespace std ;
ifstream f ("cuplaj.in") ;
ofstream g ("cuplaj.out") ;
int N , M  , E  , x , y , ans = 0;
vector <int> G[NMAX];
vector <pair <int,int> > v;
int L[NMAX] , R[NMAX] , marked[NMAX];
bool cupleaza (int nod)
{
    marked[nod] = true ;
    for (auto i: G[nod])
        if (!R[i])
    {
        R[i] = nod;
        L[nod] = i;
        return true ;
    }

    for (auto i : G[nod])
        if (!marked[R[i]] && cupleaza(R[i]))
    {
        L[nod] = i;
        R[i] = nod;
        return true;
    }

    return false;
}
int main()
{
    f >> N >> M >> E ;
    for (int i = 1 ; i <= E ; ++i)
    {
        f >> x >> y;
        G[x].push_back(y) ;
    }

    bool done = true ;
    while (done)
    {
        done = false;
        for (int i = 1 ; i <= N ; ++i) marked[i] = false;

        for (int i = 1  ; i <= N ; ++i)
            if (!marked[i] && !L[i])
                if (cupleaza(i)) done = 1;
    }

    for (int i = 1 ;  i <= N ; ++i) if (L[i])
    {
        ans ++ ;
        v.push_back({i,L[i]}) ;
    }
    g << ans << '\n';
    for (int i = 0 ; i < ans ; ++i)
        g << v[i].first << ' ' << v[i].second << '\n' ;

}