Cod sursa(job #3195163)

Utilizator vlad_binVlad Bintintan vlad_bin Data 20 ianuarie 2024 10:49:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

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

#define limn 10010

int N, M, E, A[limn], B[limn];
vector<int> G[limn];
bool viz[limn];

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

    for (auto it : G[nod]) // nod din A
        if(!B[it]) {
            B[it] = nod;
            A[nod] = it;
            return true;
        }
    
    for (auto it : G[nod]) {
        if (pairUp(B[it])) { // putem strica perechea de la B[it], asa ca combinam nod cu it
            B[it] = nod;
            A[nod] = it;
            return true;
        }
    }
    return false;
}

int main() {
    int x, y;
    in >> N >> M >> E;
    for (int i = 0; i < E; i++)
    {
        in >> x >> y;
        G[x].push_back(y);
    }
    bool path_found = true;
    while(path_found) {
        path_found = false;
        for (int i = 1; i <= N; i++)
            viz[i] = false;
        for (int i = 1; i <= N; i++)
            if(!A[i])
                path_found |= pairUp(i);
    }

    int nrMatches = 0;
    for (int i = 1; i <= N; i++)
    {
        if (A[i])
            nrMatches++;
    }
    out << nrMatches << '\n';
    for (int i = 1; i <= N; i++)
    {
        if (A[i])
            out << i << ' ' << A[i] << '\n';
    }
}