Cod sursa(job #2696223)

Utilizator miramaria27Stroie Mira miramaria27 Data 15 ianuarie 2021 16:15:55
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <vector>
#include <fstream>

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

vector <int> ad[100];
int st[100],dr[100];
vector <int> viz(100);

bool cupleaza(int nod)
{

   if(viz[nod])
        return false;

   ///pentru o iteratie, pot sa apelez cupleaza cel mult de o data
   viz[nod] = 1;
   ///ma uit la toti vecinii mei
   /// daca gasesc unul liber => ma  cuplez si ies din functie
   for(auto &i: ad[nod])
   {
       ///daca nodul i(din dreaptaa) nu are niciun partener in stanga => pot sa ma cuplez cu el
       if(!dr[i])
        {
            dr[i] = nod;
            st[nod] = i;
            return true;
        }

   }
   ///altfel incerc sa recuplez vecinii astfel incat
   /// sa ma cuplez si pe mine
   for(auto &i : ad[nod])
   {
        ///apelez recursiv functia de cuplare
        ///sa presupunem ca partenerul din stanga a nodului i (din dreapta) este x = dr[i]
        /// daca eu pe acel partener reusesc sa il recuplez => pot sa cuplez
        /// i cu nod
        if(cupleaza(dr[i]))
        {
            st[nod] = i;
            dr[i] = nod;
            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;
        ///retinem toti vecinii nodurilor din stanga (din prima multime a bipartitiei)
        ad[x].push_back(y);
    }
    ///cat timp nu mai pot sa modific (solutia mea nu se imbunatateste = nu mai gaseste
                                       /// cuplaje)
    int ok = 1;
    int sol = 0;
    while(ok)
    {

        ok = 0;
        fill(viz.begin(),viz.end(),0);
        for(int i = 1; i <=n; i++)
            ///daca nodul i din stanga nu are partener in dreapta
            ///dar i-am gasit unul => cresc solutia
            if(!st[i] && cupleaza(i))
        {
            sol ++;
            ok = 1;
        }

    }
    fout<<sol<<"\n";
    for(int i = 1; i <=n; i++)
    {
        if(st[i])
        fout<<i<<" "<<st[i]<<"\n";
    }
    return 0;
}