Cod sursa(job #3233310)

Utilizator MirceaDonciuLicentaLicenta Mircea Donciu MirceaDonciuLicenta Data 2 iunie 2024 22:55:52
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <cstring>

using namespace std;

const int MAXN = 10000;

vector<int> adj[MAXN + 1];
int pairU[MAXN + 1], pairV[MAXN + 1], dist[MAXN + 1];
int N, M, E;

bool bfs() {
    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 && dfs(pairV[v])) {
                pairV[v] = u;
                pairU[u] = v;
                return true;
            }
        }

        dist[u] = INT_MAX;
        return false;
    }
    return true;
}

int hopcroftKarp() {
    memset(pairU, 0, sizeof(pairU));
    memset(pairV, 0, sizeof(pairV));
    memset(dist, 0, sizeof(dist));

    int matching = 0;

    while (bfs()) {
        for (int u = 1; u <= N; ++u) {
            if (pairU[u] == 0 && dfs(u)) {
                ++matching;
            }
        }
    }

    return matching;
}

int main() {
    ifstream infile("cuplaj.in");
    ofstream outfile("cuplaj.out");

    infile >> N >> M >> E;

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

    int maxMatching = hopcroftKarp();

    outfile << maxMatching << endl;

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

    infile.close();
    outfile.close();

    return 0;
}