Cod sursa(job #2715140)

Utilizator dimi999Dimitriu Andrei dimi999 Data 3 martie 2021 08:36:32
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <vector>
#include <cstdlib>
using namespace std;

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

int lleft[10005], rright[10005], k = 0;

bool ok = true;

bool viz[10005];

vector <int> l[10005];

bool pairup(int node)
{
    if(viz[node])
        return false;

    viz[node] = true;

    for(int it = 0; it < (int)l[node].size(); it++)
        if(rright[l[node][it]] == 0)
    {
        k++;
        lleft[node] = l[node][it];
        rright[l[node][it]] = node;
        return true;
    }

    for(int it = 0; it < (int)l[node].size(); it++)
        if(pairup(rright[l[node][it]]))
    {
        lleft[node] = l[node][it];
        rright[l[node][it]] = node;
        return true;
    }

    return false;
}

int main()
{
    int N, M, E;

    fin >> N >> M >> E;

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

        fin >> x >> y;

        l[x].push_back(y);
    }

    while(ok)
    {
        ok = false;

        fill(viz + 1, viz + N + 1, false);

        for(int i = 1; i <= N; i++)
            if(lleft[i] == 0)
                ok |= pairup(i);
    }

    fout << k << '\n';

    for(int i = 1; i <= N; i++)
        if(lleft[i] != 0)
        fout << i << " " << lleft[i] << '\n';
    return 0;
}