Cod sursa(job #3257694)

Utilizator MikeStrikeAgache Mihai MikeStrike Data 18 noiembrie 2024 22:10:03
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <climits>
#include <cstring>

using namespace std;

const int MAXN = 1005; 

vector<int> adj[MAXN]; 
int dist[MAXN];       
int matchL[MAXN], matchR[MAXN]; 
int NIL = 0;           

bool bfs(int N) {
    queue<int> q;

    for (int u = 1; u <= N; u++) {
        if (matchL[u] == NIL) {             
            dist[u] = 0;
            q.push(u);
        } else {
            dist[u] = INT_MAX;
        }
      }
    dist[NIL] = INT_MAX;

    while (!q.empty()) {
        int u = q.front();
        q.pop();

        if (dist[u] < dist[NIL]) {
            for (int v : adj[u]) {
                if (dist[matchR[v]] == INT_MAX) {                     
                    dist[matchR[v]] = dist[u] + 1;
                    q.push(matchR[v]);
                }
            }
        }
    }

    return dist[NIL] != INT_MAX;
}

bool dfs(int u) {
    if (u != NIL) {
        for (int v : adj[u]) {
            if (dist[matchR[v]] == dist[u] + 1 && dfs(matchR[v])) {
                matchL[u] = v;
                matchR[v] = u;
                return true;
            }
        }
        dist[u] = INT_MAX;         
        return false;
    }
    return true;
}

int hopcroftKarp(int N, int M) {
    int maxMatching = 0;

    for (int i = 0; i <= N; i++) matchL[i] = NIL;
    for (int i = 0; i <= M; i++) matchR[i] = NIL;

    while (bfs(N)) {
        for (int u = 1; u <= N; u++) {
            if (matchL[u] == NIL && dfs(u)) {
                maxMatching++;
            }
        }
    }

    return maxMatching;
}

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

    int N, M, E;
    fin >> N >> M >> E;

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

    int maxMatching = hopcroftKarp(N, M);

    fout << maxMatching << "\n";

    for (int u = 1; u <= N; u++) {
        if (matchL[u] != NIL) {
            fout << u << " " << matchL[u] << "\n";
        }
    }

    return 0;
}