Cod sursa(job #2565010)

Utilizator trifangrobertRobert Trifan trifangrobert Data 2 martie 2020 11:38:14
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 10005;
int N, M, E;
vector <int> graph[NMAX];
int stg[NMAX], drp[NMAX];
bitset <NMAX> seen;

bool Cuplaj(int node)
{
    if (seen[node])
        return false;
    seen[node] = 1;
    for (auto&x : graph[node])
        if (stg[x] == 0)
        {
            drp[node] = x;
            stg[x] = node;
            return true;
        }
    for (auto& x :  graph[node])
        if (Cuplaj(stg[x]))
        {
            drp[node] = x;
            stg[x] = node;
            return true;
        }
    return false;
}

int main()
{
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    fin >> N >> M >> E;
    for (int i = 1;i <= E;++i)
    {
        int u, v;
        fin >> u >> v;
        graph[u].push_back(v);
    }
    bool ok = true;
    int cnt = 0;
    while (ok)
    {
        seen.reset();
        ok = false;
        for (int i = 1;i <= N;++i)
            if (drp[i] == 0 && Cuplaj(i))
            {
                ok = true;
                ++cnt;
            }
    }
    fout << cnt << "\n";
    for (int i = 1;i <= N;++i)
        if (drp[i] != 0)
            fout << i << " " << drp[i] << "\n";
    fin.close();
    fout.close();
    return 0;
}