Cod sursa(job #2608636)

Utilizator adiaioanaAdia R. adiaioana Data 1 mai 2020 16:40:41
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
int N,M, viz[101000],L[10100], R[10100];
vector <int> l[20100];
inline void scan() {
    int u,v,E;
    cin>>N>>M>>E;
    for(int i=1; i<=E; ++i)
    {
        cin>>u>>v;
        l[u].push_back(v);
    }
}

inline bool cup(int x)
{
    viz[x]=1;
    //ori cupleaza cu vecin/dr
    for(int i=0; i<l[x].size(); ++i)
        if(!R[l[x][i]]) {
            L[x]=l[x][i];
            R[l[x][i]]=x;
            return 1;
        }
    //ori daca toti sunt ocupati
    //cupleaza cu cel care poate fi
    //decuplat daca stii cum zic
    for(int i=0; i<l[x].size(); ++i)
        if(!viz[R[l[x][i]]] && cup(R[l[x][i]])) {
            L[x]=l[x][i];
            R[l[x][i]]=x;
            return 1;
        }
    return 0;
}
int main()
{
    bool ok;
    scan();

    do{
        ok=0;
        for(int i=1; i<=N; ++i)
            if(!viz[i] && !L[i])
                ok=max(ok,cup(i));
        for(int i=1; i<=N; viz[i++]=0);//nu inteleg ce are lumea cu memset

    }while(ok);

    int lg=0;
    for(int i=1; i<=N; lg+=(L[i++]!=0));
    cout<<lg<<'\n';
    for(int i=1; i<=N; ++i)
        if(L[i])
            cout<<i<<' '<<L[i]<<'\n';
    return 0;
}