Cod sursa(job #2253646)

Utilizator Burbon13Burbon13 Burbon13 Data 4 octombrie 2018 11:10:34
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <vector>
#define NMAX 10002

int n1, n2, m;
std::vector <int> g1[NMAX], g2[NMAX];
int leftPartner[NMAX], rightPartner[NMAX];

void readInput() {
    std::ifstream fin("cuplaj.in");
    fin >> n1 >> n2 >> m;
    for (int i = 0; i < m; i++) {
        int node1, node2;
        fin >> node1 >> node2;
        g1[node1].push_back(node2);
        g2[node2].push_back(node1);
    }
    fin.close();
}

bool pairThem(const int&node) {
    for(auto const& next: g1[node])
        if (!leftPartner[next]) {
            rightPartner[node] = next;
            leftPartner[next] = node;
            return true;
        }
    for(auto const& next: g1[node])
        if (leftPartner[next] != node && pairThem(leftPartner[next])) {
            rightPartner[node] = next;
            leftPartner[next] = node;
            return true;
        }
    return false;
}

void coupleIt() {
    bool better = true;
    while (better) {
        better = false;
        for (int i = 1; i <= n1; i++)
            better |= pairThem(i);
    }
}

void output() {
    int total = 0;
    for (int i = 1; i <= n1; i++)
        if (rightPartner[i])
            total++;
    std::ofstream fout("cuplaj.out");
    fout << total << '\n';
    for (int i = 1; i <= n1; i++)
        if (rightPartner[i])
            fout << i << ' ' << rightPartner[i] << '\n';
    fout.close();
}

int main() {
    readInput();
    coupleIt();
    output();
    return 0;
}