Cod sursa(job #2870832)

Utilizator stefantagaTaga Stefan stefantaga Data 12 martie 2022 16:42:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector <int> st[10005],dr[10005];
int n,m,e,i,x,y;
vector <pair <int,int>> sol;
int stanga[10005],dreapta[10005],sel[10005];
bool cuplaj(int x)
{
    sel[x]=1;
    for (int i=0;i<st[x].size();i++)
    {
        int nod =st[x][i];
        if (dreapta[nod]==0)
        {
            stanga[x]=nod;
            dreapta[nod]=x;
            return 1;
        }
    }
    for (int i=0;i<st[x].size();i++)
    {
        int nod = st[x][i];
        if (sel[dreapta[nod]]==0&&cuplaj(dreapta[nod])==1)
        {
            stanga[x]=nod;
            dreapta[nod]=x;
            return 1;
        }
    }
    return 0;
}
int main()
{
    f>>n>>m>>e;
    for (i=1;i<=e;i++)
    {
        f>>x>>y;
        st[x].push_back(y);
    }
    int ok=1;
    while (ok==1)
    {
        ok=0;
        for (i=1;i<=n;i++)
        {
            sel[i]=0;
        }
        for (i=1;i<=n;i++)
        {
            if (sel[i]==0&&stanga[i]==0)
            {
                ok=ok|cuplaj(i);
            }
        }
    }
    for (i=1;i<=n;i++)
    {
        if (stanga[i]!=0)
        {
            sol.push_back({i,stanga[i]});
        }
    }
    g<<sol.size()<<'\n';
    for (int i=0;i<sol.size();i++)
    {
        g<<sol[i].first<<" "<<sol[i].second<<'\n';
    }
    return 0;
}