Cod sursa(job #3307539)

Utilizator davidgeo123Georgescu David davidgeo123 Data 21 august 2025 15:12:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#pragma GCC optimize("O3", "Ofast", "unroll-loops")
#include <bits/stdc++.h>

using namespace std;

const int NMAX=10000;
int n, k, e;
bool reversed;
vector<int> g[NMAX+1];
vector<int> mt;
vector<bool> used;
vector<pair<int, int>> ans;

bool try_kuhn(int v)
{
    if(used[v])return false;
    used[v]=true;
    for(auto &to:g[v])
        if(mt[to]==-1 || try_kuhn(mt[to]))
        {
            mt[to]=v;
            return true;
        }
    return false;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    cin>>n>>k>>e;
    if(n>k)
    {
        reversed=true;
        swap(n, k);
    }
    for(int i=1, x, y; i<=e; i++)
    {
        cin>>x>>y;
        if(reversed)swap(x, y);
        g[x].push_back(y);
    }

    mt.assign(k+1, -1);
    vector<bool> used1(n+1, false);
    for(int v=1; v<=n; v++)
        for(int &to:g[v])
            if(mt[to]==-1)
            {
                mt[to]=v;
                used1[v]=true;
                break;
            }

    for(int v=1; v<=n; v++)
    {
        if(!used1[v])
        {
            used.assign(n+1, false);
            try_kuhn(v);
        }
    }

    for(int i=1; i<=k; i++)
        if(mt[i]!=-1)
            ans.push_back({mt[i], i});

    cout<<ans.size()<<'\n';
    for(auto &[x, y]:ans)
    {
        if(reversed)cout<<y<<' '<<x<<'\n';
        else cout<<x<<' '<<y<<'\n';
    }
    return 0;
}