Cod sursa(job #2603613)

Utilizator StanCatalinStanCatalin StanCatalin Data 20 aprilie 2020 14:31:11
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

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

const int dim = 10005;

int viz[dim],n,m,muchii,R[dim],L[dim];
vector <int> vec[dim];

bool Match(int nod)
{
    if (viz[nod]) return false;
    viz[nod] = 1;
    for (auto v:vec[nod])
    {
        if (!R[v])
        {
            R[v] = nod;
            L[nod] = v;
            return true;
        }
        else
        {
            if (Match(R[v]))
            {
                L[nod] = v;
                R[v] = nod;
                return true;
            }
        }
    }
}

int Cuplaj()
{
    int ok = true;
    int cnt = 0;
    while (ok == true)
    {
        ok = false;
        memset(viz,0,sizeof(viz));
        for (int i=1; i<=n; i++)
        {
            if (L[i] == 0 && Match(i))
            {
                ok = true;
                cnt++;
            }
        }
    }
    return cnt;
}

int main()
{
    in >> n >> m >> muchii;
    while (muchii--)
    {
        int x,y;
        in >> x >> y;
        vec[x].push_back(y);
    }
    out << Cuplaj() << "\n";
    for (int i=1; i<=n; i++)
    {
        if (L[i] != 0) out << i << " " << L[i] << "\n";
    }
    return 0;
}