Cod sursa(job #2208132)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 28 mai 2018 13:24:11
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e4;
vector <int> adj[NMAX];
int used[NMAX];
int match1[NMAX], match2[NMAX];

bool match (int node) {
    if (used[node]) {
        return false;
    }
    used[node] = 1;

    for (auto &i : adj[node]) {
        if (match2[i] == -1) {
            match2[i] = node;
            match1[node] = i;
            return true;
        }
    }

    for (auto &i : adj[node]) {
        if (match(match2[i])) {
            match1[node] = i;
            match2[i] = node;
            return true;
        }
    }

    return false;
}

int main() {
    int n, m, e;
    f >> n >> m >> e;
    for (int i = 0; i < e; ++i) {
        int u, v;
        f >> u >> v;
        --u; --v;
        adj[u].push_back(v);
    }

    memset (match1, -1, sizeof(match1));
    memset (match2, -1, sizeof(match2));
    bool wasChanged = true;
    while (wasChanged) {
        wasChanged = false;

        memset (used, 0, sizeof(used));

        for (int i = 0; i < n; ++i) {
            if (match1[i] == -1 && match(i)) {
                wasChanged = true;
            }
        }
    }
    int numOfMatches = 0;
    for (int i = 0; i < n; ++i) {
        if (match1[i] != -1) {
            ++numOfMatches;
        }
    }
    g << numOfMatches << '\n';

    for (int i = 0; i < n; ++i) {
        if (match1[i] != -1) {
            g << i + 1 << ' ' << match1[i] + 1 << '\n';
        }
    }

    f.close();
    g.close();
    return 0;
}