Cod sursa(job #2815755)

Utilizator ElizaTElla Rose ElizaT Data 10 decembrie 2021 10:56:49
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e5;
int l[NMAX + 5],r[NMAX + 5];
bool viz[NMAX + 5];
vector <int> edges[NMAX + 5];
int n,m;

void init() {
    for (int i = 1;i <= n;i++)
        viz[i] = 0;
}
bool PairUp(int node) {
    if (viz[node])
        return 0;
    viz[node] = 1;
    for (int i = 0;i < edges[node].size();i++) {
        if (!l[edges[node][i]]) {
            l[edges[node][i]] = node;
            r[node] = edges[node][i];
            return 1;
        }
    }
    for (int i = 0;i < edges[node].size();i++) {
        if (PairUp(l[edges[node][i]])) {
            l[edges[node][i]] = node;
            r[node] = edges[node][i];
            return 1;
        }
    }
    return 0;
}
int main()
{
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    int e,a,b,ok = 1,cnt = 0;
    fin >> n >> m >> e;
    for (int i = 0;i < e;i++) {
        fin >> a >> b;
        edges[a].push_back(b);
    }
    while (ok) {
        ok = 0;
        init();
        for (int i = 1;i <= n;i++)
            if (!r[i])
                ok |= PairUp(i);
    }
    for (int i = 1;i <= n;i++)
        if (r[i])
            cnt++;
    fout << cnt << '\n';
    for (int i = 1;i <= n;i++)
        if (r[i])
            fout << i << " " << r[i] << '\n';
    return 0;
}