Cod sursa(job #3183407)

Utilizator NeganAlex Mihalcea Negan Data 11 decembrie 2023 19:37:40
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

int n, m, e;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

vector<int> V[10005];
int lft[10005], rgt[10005];
int viz[10005];
void Citire()
{
    int x, y;
    fin >> n >> m >> e;
    for(int i = 1;i <= e;i++)
    {
        fin >> x >> y;
        V[x].push_back(y);
    }
}
bool Cuplaj(int nod)
{
    if(viz[nod])
        return 0;
    viz[nod] = 1;
    for(auto x : V[nod])
        if(rgt[x] == 0)
        {
            rgt[x] = nod;
            lft[nod] = x;
            return 1;
        }
    for(auto x : V[nod])
        if(Cuplaj(rgt[x]))
        {
            rgt[x] = nod;
            lft[nod] = x;
            return 1;
        }
    return 0;
}
void Solve()
{
    int ok = 1, i;
    int cnt = 0;
    while(ok)
    {
        ok = 0;
        for(i = 1;i <= n;i++)
            viz[i] = 0;
        for(i = 1;i <= n;i++)
            if(lft[i] == 0 && Cuplaj(i))
            {
                cnt++;
                ok = 1;
            }
    }
    fout << cnt << "\n";
    for(i = 1;i <= n;i++)
        if(lft[i] != 0)
            fout << i << " " << lft[i] << "\n";

}
int main()
{
    Citire();
    Solve();
    return 0;
}