Cod sursa(job #2696876)

Utilizator dariahazaparuHazaparu Daria dariahazaparu Data 17 ianuarie 2021 00:25:32
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

const int N_MAX = 100005;
const int INF = 1e9;

std :: vector <int> graph[N_MAX];
int l[N_MAX], r[N_MAX];
bool vis[N_MAX], ok = true;
int n, m, e;

bool path(int i);

int main() {
    std :: ifstream fin("cuplaj.in");
    std :: ofstream fout("cuplaj.out");

    fin >> n >> m >> e;
    for (int i = 1; i <= e; ++i) {
        int a, b;
        fin >> a >> b;
        graph[a].push_back(b);
    }

    int cuplaje = 0;
    while (ok) {
        ok = false;
        for (int i = 1; i <= n; ++i) {
            vis[i] = false;
        }
        for (int i = 1; i <= n; ++i) {
            if (l[i] == 0 and path(i)) {
                cuplaje++;
                ok = true;
            }
        }
    }

    fout << cuplaje << '\n';
    for (int i = 1; i <= n; ++i) {
        if (l[i]) {
            fout << i << " " << l[i] << "\n";
        }
    }


    return 0;
}

bool path(int node) {
    if (vis[node])
        return false;
    vis[node] = true;
    for (auto i: graph[node]) {
        if (r[i] == 0 or path(r[i])) {
            l[node] = i;
            r[i] = node;
            return true;
        }
    }
    return false;
}