Cod sursa(job #3283464)

Utilizator ArthurrrfubinacaARthur Paun Arthurrrfubinaca Data 9 martie 2025 17:13:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#define NMAX 10005

using namespace std;

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

int n , m , e , sol;
vector<int> g[NMAX];
bool viz[NMAX];
int l[NMAX] , r[NMAX];

bool connect(int node)
{
    if(viz[node])
        return false;
    viz[node] = true;
    for(auto i : g[node])
    {
        if(!r[i])
        {
            l[node] = i;
            r[i] = node;
            return true;
        }
    }
    for(auto i : g[node])
    {
        if(connect(r[i]))
        {
            l[node] = i;
            r[i] = node;
            return true;
        }
    }
    return false;
}

int main()
{
    fin >> n >> m >> e;
    for(int i = 1 ; i <= e ; i ++)
    {
        int x, y;
        fin >> x >> y;
        g[x].push_back(y);
    }

    bool solved;

    do
    {
        solved = 0;
        memset(viz , 0 , sizeof(viz));
        for(int i = 1 ; i <= n ; i ++)
        {
            if(!l[i])
                solved = solved | connect(i);
        }
    }
    while(solved);

    for(int i = 1 ; i <= n ; i ++)
        if(l[i])
        sol ++;

    fout << sol << '\n';

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