Cod sursa(job #2699472)

Utilizator sebastiannrxRichiteanu Mihai Sebastian sebastiannrx Data 24 ianuarie 2021 17:02:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <list>
using namespace std;

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

#define n_max 10005

int n,m,e,sol;
int viz[n_max],copil[n_max],tata[n_max];
list<int> L[n_max];


void read()
{
    f>>n>>m>>e;
    for (int i=0;i<e;++i)
    {
        int x,y;
        f>>x>>y;
        L[x].push_back(y);
    }
}

int cuplaj(int nod)
{
    if (viz[nod])
        return 0;
    viz[nod] = 1;
    for (int it : L[nod])
        if (tata[it] == 0 || cuplaj(tata[it]))
        {
            copil[nod] = it;
            tata[it] = nod;
            return 1;
        }
    return 0;
}

void out()
{
    g<<sol<<'\n';
    for (int i=1;i<=n;++i)
        if (copil[i])
            g<<i<<" "<<copil[i]<<'\n';

}



int main()
{
    read();
    while (1)
    {
        int ok = 0;
        memset(viz,0,sizeof(viz));
        for (int i=1;i<=n;++i)
            if (copil[i] == 0 && cuplaj(i))
            {
                ++sol;
                ok = 1;
            }
        if (!ok)
            break;
    }
    out();
    return 0;
}