Cod sursa(job #2822398)

Utilizator AndreeaCreitaCreita Andreea AndreeaCreita Data 23 decembrie 2021 22:26:15
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

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

vector<int> la[100005];
int st[100005],dr[100005],viz[100005];
int n1,n2,m,x,y;

int cupl(int nod)
{
    if (viz[nod])
        return 0;
    viz[nod] = 1;

    for (auto& vecin: la[nod])
    {
        if (dr[vecin] == 0)
        {
            dr[vecin] = nod;
            st[nod] = vecin;
            return 1;
        }
    }

    for (auto& vecin: la[nod])
    {
        if (cupl(dr[vecin]))
        {
            dr[vecin] = nod;
            st[nod] = vecin;
            return 1;
        }
    }
    return 0;
}

int main()
{
    in >> n1 >> n2 >> m;
    for (int i = 0; i < m; i++)
    {
        in >> x >> y;
        la[x].push_back(y);
    }

    int opt = 1;
    int cuplaj = 0;
    while (opt)
    {
        opt = 0;
        for (int i = 0; i < 100005; i ++)
            viz[i] = 0;
        for (int i = 1; i <= n1; i++)
        {
            if (st[i] == 0 && cupl(i))
            {
                opt = 1;
                cuplaj++;
            }
        }
    }

    out << cuplaj << '\n';
    for (int i = 1; i <= n1; i++)
    {
        if (st[i])
            out << i << ' ' << st[i] << '\n';
    }

    return 0;
}