Cod sursa(job #3231563)

Utilizator tricksteryetiGeorge Popa tricksteryeti Data 27 mai 2024 11:04:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <climits>
#include <fstream>

using namespace std;

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

const int MAXN = 10001;

vector<int> adj[MAXN];
int pairU[MAXN], pairV[MAXN], dist[MAXN];

bool bfs(int N) {
    queue<int> Q;
    for (int u = 1; u <= N; u++) {
        if (pairU[u] == 0) {
            dist[u] = 0;
            Q.push(u);
        } else {
            dist[u] = INT_MAX;
        }
    }
    dist[0] = INT_MAX;
    while (!Q.empty()) {
        int u = Q.front(); Q.pop();
        if (dist[u] < dist[0]) {
            for (int v : adj[u]) {
                if (dist[pairV[v]] == INT_MAX) {
                    dist[pairV[v]] = dist[u] + 1;
                    Q.push(pairV[v]);
                }
            }
        }
    }
    return dist[0] != INT_MAX;
}

bool dfs(int u) {
    if (u != 0) {
        for (int v : adj[u]) {
            if (dist[pairV[v]] == dist[u] + 1) {
                if (dfs(pairV[v])) {
                    pairV[v] = u;
                    pairU[u] = v;
                    return true;
                }
            }
        }
        dist[u] = INT_MAX;
        return false;
    }
    return true;
}

int alg(int N, int M) {
    memset(pairU, 0, sizeof(pairU));
    memset(pairV, 0, sizeof(pairV));
    int matching = 0;
    while (bfs(N)) {
        for (int u = 1; u <= N; u++)
            if (pairU[u] == 0 && dfs(u))
                matching++;
    }
    return matching;
}

int main() {
    int N, M, E;
    in >> N >> M >> E;

    for (int i = 0, u, v; i < E; i++) {
        in >> u >> v;
        adj[u].push_back(v);
    }

    int maxMatching = alg(N, M);
    out << maxMatching << endl;

    for (int u = 1; u <= N; u++)
        if (pairU[u] != 0)
            out << u << " " << pairU[u] << endl;

    return 0;
}