Cod sursa(job #2967181)

Utilizator tm123321teo mihailescu tm123321 Data 19 ianuarie 2023 10:26:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <iostream>
#include <vector>
#define N_MAX 20001
using namespace std;

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



vector<int> la[N_MAX];
bool viz[N_MAX];
int tata[N_MAX];

bool realizare_cuplaj(int nod)//O(sqrt(V)*E), unde V - nr de noduri, E - nr de muchii
{
    viz[nod] = 1;
    for(int i : la[nod])
    {
         if(tata[i] == 0)// daca nu are tata atunci reunim
        {
            tata[nod] = i;
            tata[i] = nod;
            return 1;
        }


        if(viz[tata[i]]==0 && realizare_cuplaj(tata[i]))// vedem daca putem forma o alta pereche cu nod adiacent
        {
            tata[nod] = i;
            tata[i] = nod;
            return 1;
        }
    }
    return 0;
}

int main()
{
    int N, M, E, nr = 0;
    f>>N>>M>>E;

    for(int i = 0; i < E; i++)
    {   int x,y;
        f>>x>>y;
        y += N;                         // vedem cate nod avem in mult ini ca sa putem verif ca s unice
        la[x].push_back(y);
    }

    bool ok = 1;

    while(ok == 1)
    {
        ok = 0;
        for(int i = 1; i <= N; i++)

            if(!viz[i] && !tata[i] && realizare_cuplaj(i))// daca nodul nu are tata si nu e vizitat incercam sa facem perechea
            {
                nr++;
                ok = 1;
            }
        for(int i = 1; i <= N + M; i++)
            viz[i] = 0;
    }

    g << nr << '\n';
    for(int i = 1; i <= N; i++)
        if(tata[i] != 0)
            g << i << " " << tata[i] - N << '\n';
    return 0;
}