Cod sursa(job #2134685)

Utilizator rangal3Tudor Anastasiei rangal3 Data 18 februarie 2018 11:19:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>

using namespace std;

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

int n,m,st[10003],dr[10003];
//st[i] nodul cu care se cupleaza nodul i din B
//dr[i] nodul cu care se cupleaza nodul i din A
vector<int> L[10003];
int cuplajMax; //numarul de muchii din cuplajul maxim
int viz[10003]; // viz[i] = 1 daca nodul i din stanga este cuplat;
int x,y,e;

//incerc sa cuplez nodul k. return 1 daca reusesc

int Cupleaza(int k)
{
    if(viz[k] == 1) return 0; //e deja cuplat;
    viz[k] = 1;
    for(auto i : L[k])
        if(dr[i] == 0) //i e necuplat;
        {
            st[k] = i;
            dr[i] = k;
            return 1;
        }
    /* n-am reusit sa-l cuplez pe k deci mai parcurg o data L[k] si poate reusesc sa cuplez pe k cu un nod necuplat */
    for(auto i : L[k])
        if(Cupleaza(dr[i]))
        {
            st[k] = i;
            dr[i] = k;
            return 1;
        }
    return 0;
}

void Citire()
{
    fin>>n>>m>>e;
    while(e--)
    {
        fin>>x>>y;
        L[x].push_back(y);
    }
}

void Rezolva()
{
    int i, gata = 0;
    while(!gata)
    {
        gata = 1;
        for(int i=1; i<=n; ++i)
            viz[i] = 0;
        for(int i=1; i<=n; ++i)
            if(st[i] == 0 && Cupleaza(i))
        {
            ++cuplajMax;
            gata = 0;
        }
    }

    fout<<cuplajMax<<"\n";
    for(int i=1; i<=n; ++i)
        if(st[i] != 0)
            fout<<i<<" "<<st[i]<<"\n";
    fout<<"\n";
    fout.close();
}

int main()
{
    Citire();
    Rezolva();
    return 0;
}