Cod sursa(job #3338170)

Utilizator 0021592Grecu rares 0021592 Data 1 februarie 2026 10:52:12
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in ("cuplaj.in");
ofstream out ("cuplaj.out");
const int NMAX = 10010;
int n, m, q, l[NMAX], r[NMAX], viz[NMAX], cnt, best, i, a, b;
bool change;
vector<vector<int>> mat;
bool cuplaj(int node)
{
    if (viz[node] == cnt)
        return 0;
    viz[node] = cnt;
    for (auto ind : mat[node])
        if (r[ind] == 0)
        {
            l[node] = ind;
            r[ind] = node;
            return 1;
        }
    for (auto ind : mat[node])
        if (cuplaj(r[ind]) == 1)
        {
            l[node] = ind;
            r[ind] = node;
            return 1;
        }
    return 0;
}
int main()
{
    in >> n >> m >> q;
    mat.resize(n+5);
    while(q)
    {
        --q;
        in >> a >> b;
        mat[a].push_back(b);
    }
    change=1;
    while(change)
    {
        change=0;
        cnt++;
        for (i = 1; i <= n; i++)
            if (l[i] == 0)
                change |= cuplaj(i);
    }
    for (i = 1; i <= n; i++)
        best += (l[i]!=0);
    out << best << '\n';
    for (i = 1; i <= n; i++)
        if (l[i] != 0)
            out << i << ' ' << l[i] << '\n';
    return 0;
}