Cod sursa(job #2884109)

Utilizator servus2022Stefan Tonut servus2022 Data 2 aprilie 2022 13:38:20
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 1e4 + 1, MMAX = 1e4 + 1;

int N;
vector < int > G[NMAX];
bool Marked[NMAX];
int L[NMAX];

int M;
int R[MMAX];

static inline void Read ()
{
    f.tie(nullptr);

    f >> N >> M;

    int E = 0;
    f >> E;

    for(int i = 1; i <= E; ++i)
    {
        int x = 0, y = 0;
        f >> x >> y;

        G[x].push_back(y);
    }

    return;
}

static inline bool Go (int Node)
{
    Marked[Node] = 1;

    for(auto it : G[Node])
        if(!R[it])
        {
            L[Node] = it, R[it] = Node;

            return true;
        }

    for(auto it : G[Node])
        if(!Marked[R[it]] && Go(R[it]))
        {
            L[Node] = it, R[it] = Node;

            return true;
        }

    return false;
}

static inline int MaxMatch ()
{
    int ans = 0;

    bool done = 1;
    while(done)
    {
        done = 0;

        for(int i = 1; i <= N; ++i)
            Marked[i] = false;

        for(int i = 1; i <= N; ++i)
            if(!Marked[i] && !L[i])
                done |= Go(i);
    }

    for(int i = 1; i <= N; ++i)
        ans += (bool)(L[i] != 0);

    return ans;
}

static inline void Solve ()
{
    g << MaxMatch() << '\n';

    for(int i = 1; i <= N; ++i)
        if(L[i])
            g << i << ' ' << L[i] << '\n';

    return;
}

int main()
{
    Read();

    Solve();

    return 0;
}