Cod sursa(job #2968712)

Utilizator ArseniuVictorStefanArseniu Victor Stefan ArseniuVictorStefan Data 21 ianuarie 2023 20:28:54
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>

#define NMAX (10'000)
#define MMAX (10'000)

std::ifstream cin("cuplaj.in");
std::ofstream cout("cuplaj.out");

std::vector<int> g[NMAX + 1];

int l[NMAX + 1], r[MMAX + 1];

bool used[NMAX + 1];

bool dfs(int u)
{
    if(used[u])
        return false;

    used[u] = true;

    for(int v : g[u])
        if(!r[v])
        {
            r[v] = u;
            l[u] = v;
            return true;
        }
    
    for(int v : g[u])
        if(dfs(r[v]))
        {
            r[v] = u;
            l[u] = v;
            return true;
        }
    
    return false;
}

int main()
{
    int n, m, e;
    cin >> n >> m >> e;

    for(int i = 0; i < e; i++)
    {
        int u, v;
        cin >> u >> v;

        g[u].push_back(v);
    }

    while(true)
    {
        for(int i = 1; i <= n; i++)
            used[i] = false;
        
        bool ok = false;
        for(int i = 1; i <= n; i++)
            if(!l[i])
                ok = (ok || dfs(i));
        
        if(!ok)
            break;
    }

    int nr = 0;

    for(int i = 1; i <= n; i++)
        if(l[i])
            nr++;
    
    cout << nr << '\n';

    for(int i = 1; i <= n; i++)
        if(l[i])
            cout << i << ' ' << l[i] << '\n';
    
    return 0;
}