Cod sursa(job #3195161)

Utilizator devilexeHosu George-Bogdan devilexe Data 20 ianuarie 2024 10:48:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;

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

const int MAXN = 10000;
int N, M, E;
int A[MAXN + 1], B[MAXN + 1];
vector<int> AtoB[MAXN + 1];
bool viz[MAXN + 1];

bool pair_up(int nod)
{
    if(viz[nod])
        return false;
    viz[nod] = true;

    for(const auto& i : AtoB[nod])
        if(!B[i])
        {
            A[nod] = i;
            B[i] = nod;
            return true;
        }
    for(const auto& i : AtoB[nod])
        if(pair_up(B[i])) {
            A[nod] = i;
            B[i] = nod;
            return true;
        }
    return false;
}

int main() 
{
    fin >> N >> M >> E;
    int a, b;
    while(E--) {
        fin >> a >> b;
        AtoB[a].push_back(b);
    }
    bool path_found = true;
    while(path_found) {
        path_found = false;
        // memset(viz, 0, sizeof viz);
        for(int i = 1; i <= N; ++i)
            viz[i] = 0;
        for(int i = 1; i <= N; ++i)
            if(!A[i])
                path_found |= pair_up(i);
    }
    int nrp = 0;
    for(int i = 1; i <= N; ++i)
        if(A[i]) ++nrp;
    fout << nrp << '\n';
    for(int i = 1; i <= N; ++i)
        if(A[i])
            fout << i << ' ' << A[i] << '\n';
    return 0;
}