Cod sursa(job #3289719)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 28 martie 2025 11:45:52
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#define mp make_pair

using namespace std;

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

const int nmax = 10005;
int n, m, e, vec[nmax], vec2[nmax], fr[nmax];
vector<int> v[10005];
vector< pair<int, int> > ans;

bool cuplaj(int nod)
{
    if(fr[nod]) return 0;

    int oki = 0; fr[nod] = 1;

    for(auto x : v[nod])
        if(!vec2[x])
        {
            vec2[x] = nod;
            vec[nod] = x;
            oki = 1; break;
        }

    if(!oki)
        for(auto x : v[nod])
            if(vec2[x] && cuplaj(vec2[x]))
            {
                vec2[x] = nod;
                vec[nod] = x;
                oki = 1; break;
            }

    return oki;
}

void cuplaj_max()
{
    int oki = 1;
    while(oki)
    {
        for(int i = 1; i <= n; i ++) fr[i] = 0;

        oki = 0;
        for(int i = 1; i <= n; i ++)
            if(!vec[i]) oki += cuplaj(i);
    }
}

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

    cuplaj_max();

    for(int i = 1; i <= n; i ++)
        if(vec[i])
            ans.push_back(mp(i, vec[i]));

    g << ans.size() << '\n';
    for(auto x : ans)
        g << x.first << " " << x.second << '\n';
    return 0;
}