Cod sursa(job #2659427)

Utilizator Vlad.Vlad Cristian Vlad. Data 16 octombrie 2020 19:28:56
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 10005
#define EMAX 100005
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int N, M, E;
vector<vector<int>> gr;
int lef[NMAX], righ[NMAX];
bool d[EMAX];
void read() {
    int x, y;
    fin >> N >> M >> E;
    gr.resize(N + 1);
    for (int i = 0; i < E; ++i) {
        fin >> x >> y;
        gr[x].push_back(y);
    }
}
int cupleaza(int a, int b) {
    lef[a] = b;
    righ[b] = a;
}
bool link(int node) {
    if (d[node] == true) {
        return false;
    }
    d[node] = true;
    for (int i : gr[node]) {
        if (righ[i] == 0) {
            cupleaza(node, i);
            return true;
        }
    }
    for (int i : gr[node]) {
        if (link(righ[i])) {
            cupleaza(node, i);
            return true;
        }
    }
    return false;
}
int main()
{
    read();
    bool ok = true;
    while (ok) {
        ok = false;
        memset(d, false, sizeof d);
        for (int i = 1; i <= N; ++i) {
            if (!lef[i])
            ok = ok | link(i);
        }
    }
    int con = 0;
    for (int i = 1; i <= N; ++i) {
        if (lef[i] != 0) {
            ++con;
        }
    }
    fout << con << "\n";
    for (int i = 1; i <= N; ++i) {
        if (lef[i] != 0) {
            fout << i << " " << lef[i] << "\n";
        }
    }
    return 0;
}