Cod sursa(job #2266886)

Utilizator EclipseTepes Alexandru Eclipse Data 22 octombrie 2018 22:18:38
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define dMAX 10000

using namespace std;

int n, m, e;
int x, y;
bool change;
int L[dMAX + 2], R[dMAX + 2], U[dMAX + 2];
vector<int> graf[dMAX + 2];

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

bool PairUp(const int a) {
    if (U[a]) return false;
    U[a] = true;
    int i, j, newV;
    for (i = 0; i < graf[a].size(); i++) {
        newV = graf[a][i];
        if (!R[newV]) {
            L[a] = newV;
            R[newV] = a;
            return true;
        }
    }
    for (i = 0; i < graf[a].size(); i++) {
        newV = graf[a][i];
        if (PairUp(R[newV])) {
            L[a] = newV;
            R[newV] = a;
            return true;
        }
    }
    return false;
}

int main()
{
    int i, j;
    fin >> n >> m >> e;
    for (i = 1; i <= e; i++) {
        fin >> x >> y;
        graf[x].push_back(y);
    }
    change = true;
    while (change) {
        change = false;
        memset(U, false, sizeof(U));
        for (i = 1; i <= n; i++) {
            if (!L[i]) {
                change |= PairUp(i);
            }
        }
    }

    int cuplaj = 0;
    for (i = 1; i <= n; i++) {
        cuplaj += (L[i] > 0);
    }
    fout << cuplaj << '\n';
    for (i = 1; i <= n; i++) {
        if (L[i] > 0) {
            fout << i << ' ' << L[i] << '\n';
        }
    }

    return 0;
}