Cod sursa(job #2423123)

Utilizator HannaLieb Hanna Hanna Data 20 mai 2019 19:56:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>

using namespace std;

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

int n,m,e,i,a,b;
vector<int>par;
vector<int>lat;

struct adat
{
    int par=0;
    vector<int>el;
};
vector<adat>x;

bool ok;

bool parosit(int csp)
{
    if(lat[csp]) return false;
    else lat[csp]=true;

    for(auto e : x[csp].el)
    {
        if(!par[e])
        {
            par[e]=csp;
            x[csp].par=e;
            return true;
        }
    }
    for(auto e : x[csp].el)
    {
        if(parosit(par[e]))
        {
            par[e]=csp;
            x[csp].par=e;
            return true;
        }
    }
    return false;
}

vector<pair<int,int> >megold;

int main()
{
    cin>>n>>m>>e;
    x.resize(n+1);
    par.resize(m+1,0);
    for(i=1;i<=e;++i)
    {
        cin>>a>>b;
        x[a].el.push_back(b);
    }

    ok=true;

    while(ok)
    {
        ok=false;

        lat.clear();
        lat.resize(n+1,0);
        for(i=1;i<=n;++i)
        if(!lat[i] && !x[i].par)
            if(parosit(i)) ok=true;
    }

    for(i=1;i<=n;++i)
    if(x[i].par) megold.push_back({i,x[i].par});

    cout<<megold.size()<<"\n";
    for(auto e : megold) cout<<e.first<<" "<<e.second<<"\n";

    return 0;
}