Cod sursa(job #2882794)

Utilizator DariusGhercaDarius Gherca DariusGherca Data 31 martie 2022 19:57:40
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
#include <vector>

using namespace std;

const int N = 10001;

vector <int> a[N], b[N];
int m, n, pereche[N];
bool viz[N], cuplat[N];

int caut_cuplaj_ini(int x)
{
    for (auto y: a[x])
    {
        if (pereche[y] == 0)
        {
            return y;
        }
    }
    return 0;
}

bool incearca(int x)
{
    if (viz[x])
    {
        return false;
    }
    viz[x] = true;
    for (auto y: a[x])
    {
        if (pereche[y] == 0 || incearca(pereche[y]))
        {
            cuplat[x] = true;
            pereche[y] = x;
            return true;
        }
    }
    return false;
}

void init_viz()
{
    for (int i = 1; i <= m; i++)
    {
        viz[i] = false;
    }
}

int main()
{
    ifstream in("cuplaj.in");
    ofstream out("cuplaj.out");
    int e;
    in >> m >> n >> e;
    for (int i = 0; i < e; i++)
    {
        int x, y;
        in >> x >> y;
        a[x].push_back(y);
        b[y].push_back(x);
    }
    in.close();
    //cuplajul initial
    for (int i = 1; i <= m; i++)
    {
        int x = caut_cuplaj_ini(i);
        if (x != 0)
        {
            pereche[x] = i;
            cuplat[i] = true;
        }
    }
    int l_cuplaj = 0;
    bool imbunatatit;
    do
    {
        imbunatatit = false;
        init_viz();
        for (int i = 1; i <= m; i++)
        {
            if (!cuplat[i])
            {

                cuplat[i] = incearca(i);
                if (cuplat[i])
                {
                    imbunatatit = true;
                }
            }
        }
    }
    while (imbunatatit);

    for (int i = 1; i <= n; i++)
    {
        if (pereche[i] != 0)
        {
            l_cuplaj++;
        }
    }
    out << l_cuplaj << "\n";
    for (int i = 1; i <= n; i++)
    {
        if (pereche[i] != 0)
        {
            out << pereche[i] << " " << i << "\n";
        }
    }
    out.close();
    return 0;
}