Cod sursa(job #3361799)

Utilizator ililogIlinca ililog Data 28 iulie 2026 16:47:02
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
/*Cuplaj maxim in graf bipartit*/ 
#include<iostream>
#include<vector>
#include<fstream>
#include <string.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

#define NMAX 10001
int n,m,e;
vector<int> G[NMAX], st(NMAX,0), dr(NMAX,0);
int uz[NMAX];
int pas = 1;

bool cupleaza(int worker) {
    if (uz[worker] == pas) return 0; //nu poate fi deranjat la acest pas
    uz[worker] = pas;
    for (auto job: G[worker]) {
        if (!dr[job] /*nu este cuplat*/) {
            dr[job] = worker;
            st[worker] = job;
            return 1;
        }
    }

    for (auto job: G[worker]) {
        if (cupleaza(dr[job]) /*perechea lui poate fi recuplata*/) {
            dr[job] = worker;
            st[worker] = job;
            return 1;
        }
    }
    return 0;
}

int main() {
    fin >> n >> m >> e;
    while (e--) {
        int worker,job; fin >> worker >> job;
        G[worker].push_back(job);
    }

    int nrperechi = 0;
    //incerc sa cuplez cum pot
    for (int worker = 1; worker <= n; worker++) { 
        for (auto job : G[worker]) {
            if (!dr[job]) {
                st[worker] = job;
                dr[job] = worker;
                nrperechi++;
                break; 
            }
        }
    }

    for (int worker = 1; worker<=n; worker++) {
        if (st[worker]) continue; //este cuplat
        pas++;
        if (cupleaza(worker)) { //incerc sa reorganizez
            nrperechi++;
        }
        
    }

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