Cod sursa(job #3342031)

Utilizator razviii237Uzum Razvan razviii237 Data 22 februarie 2026 15:02:36
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

const int maxn = 10005;

vector <int> nod[maxn];

int a, b, m, x, y, ans;
int l[maxn], r[maxn];
bool viz[maxn];

bool check(int x) { // x este nod din stanga
    if(viz[x] == true) {
        return false;
    }
    viz[x] = true;
    for(auto u : nod[x]) { // u este din partea dreapta, vecin al lui x
        if(l[u] == false) { // daca u nu este cuplat cu niciun nod
            l[u] = x;
            r[x] = u;
            return true; // true -> am reusit sa mai fac inca o cuplare
        }
    }
    for(auto u : nod[x]) {
        if(check(l[u]) == true) { // l[u] - nodul cu care e deja cuplat nodul u
            r[x] = u;
            l[u] = x;
            return true;
        }
    }
    return false; // false -> nu am reusit sa cuplez nodul x cu niciun nod din dreapta
}

int main()
{
    int i;
    f >> a >> b >> m;
    for(i = 1; i <= m; i ++) {
        f >> x >> y;
        nod[x].push_back(y);
    }
    // r[i] = care este nodul din dreapta cu care e cuplat nodul i (nodul i fiind din stanga)
    // l[i] = care este nodul din stanga cu care e cuplat nodul i (nodul i fiind din dreapta)
    bool ok;
    // do {
    //     ok = false;

        for(i = 1; i <= a; i ++) {
            memset(viz, false, sizeof(viz));
            if(r[i] == false && check(i) == true) {
                ans ++;
                ok = true;
            }
        }
    // } while(ok == true);

    g << ans << '\n';
    for(i = 1; i <= a; i ++) {
        if(r[i] != 0) {
            g << i << ' ' << r[i] << '\n';
        }
    }

    f.close();
    g.close();
    return 0;
}
/*


Stanga: A, B, C, D
Dreapta: 1, 2, 3, 4

A-1, 2, 3, 4
B-1, 2, 3
C-1, 2, 3
D-4



Stanga: a1-a5
Dreapta: p1-p5

    a1  a2  a3  a4  a5
p1  x   x
p2  x   x   x   x
p3  x   x   x   x
p4                  x
p5          x   x   x

Nu e corect daca se cupleaza a5 cu p5. (trebuie cuplat a5 cu p4)

o - x - -
x o - - -
- x x x o
- - x o x
x x - - -

x - o - -
o x - - -
- x x o x
- - x x o
x o - - -


   1  2
A  x  o
B  o

*/