Cod sursa(job #2844077)

Utilizator VladPislaruPislaru Vlad Rares VladPislaru Data 3 februarie 2022 18:28:52
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");

vector <int> adj[10005];

int n, m , e;
int st[10005], dr[10005];
bitset <10005> viz;

void Citire ()
{
    int i, j;
    fin >> n >> m >> e;
    for (int k = 1; k <= e; k++)
    {
        fin >> i >> j;
        adj[i].push_back(j);
    }
}

int Cuplaj (int nod)
{
    if (viz[nod] == 1)
        return 0;
    viz[nod] = 1;
    for (int nod_2 : adj[nod]) /// caut in adiacentii lui nod
    {
        if (dr[nod_2] == 0) /// dr[nod_2] = 0 => nod_2 nu este cuplat
        {
            /// cuplez nodurile nod si nod_2
            st[nod] = nod_2;
            dr[nod_2] = nod;
            return 1;
        }
    }
    /// daca ajung aici, toti adiacentii lui nod sunt deja cuplati
    /// incerc sa "decuplez" fiecare dintre adiacentii lui nod
    /// repetand aceeasi procedura
    for (int nod_2 : adj[nod])
    {
        if (Cuplaj(dr[nod_2]) == 1)
        {
            /// cuplez acum nod_2 cu nod
            st[nod] = nod_2;
            dr[nod_2] = nod;
            return 1;
        }
    }
    /// daca ajung aici nu se mai pot realiza cuplaje
    return 0;
}

void Cuplaj_Max()
{
    int i, done = 0, cnt = 0;
    while (!done)
    {
        done = 1;
        viz.reset();
        for (i = 1; i <= n; i++)
            if (st[i] == 0 && Cuplaj(i))
            {
                done = 0;
                cnt++;
            }
    }
    fout << cnt << "\n";
    for (int i = 1; i <= n; i++)
        if (st[i] != 0)
            fout << i << " " << st[i] << "\n";
}

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