Cod sursa(job #2663932)

Utilizator marius004scarlat marius marius004 Data 27 octombrie 2020 17:10:09
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

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

const int NMAX = 10'001;

int len1, len2, m, L[NMAX], R[NMAX];
vector < int > G[NMAX];
bitset < NMAX > U;

bool cupleaza(const int& node) {

    if(U[node] == 1)
        return 0;

    U[node] = 1;

    for(int neighbor : G[node]) {
        if(R[neighbor] == 0) {
            L[node] = neighbor;
            R[neighbor] = node;
            return true;
        }
    }

    // toti vecinii sunt cuplati
    for(int neighbour : G[node]) {
        if(cupleaza(neighbour)) {
            L[node] = neighbour;
            R[neighbour] = node;
            return true;
        }
    }

    return false;
}

int main() {

    f >> len1 >> len2 >> m;

    while(m--) {

        int left, right;
        f >> left >> right;

        G[left].push_back(right);
    }

    bool ok{ true };
    while(ok) {

        ok = false;
        U.reset();
        for(int i = 1;i <= len1;++i)
            if(L[i] == 0)
                ok |= cupleaza(i);
    }

    vector < pair < int, int > > sol;
    for(int i = 1;i <= len1;++i) {
        if(L[i] != 0)
            sol.push_back({i, L[i]});
    }

    g << (int)sol.size() << '\n';
    for(auto& it : sol)
        g << it.first << ' ' << it.second << '\n';

    return 0;
}