Cod sursa(job #2819982)

Utilizator Pop_MariaPop Maria Pop_Maria Data 19 decembrie 2021 16:01:59
Problema Cuplaj maxim in graf bipartit Scor 32
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.33 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

class Graf
{
    int numar_noduri, numar_muchii;
    vector <vector <int>> lista_adiacenta;

public:

    void cuplaj_maxim_initializare();
    int dfs_cuplaj_maxim(int, vector <int> &, int[], int[]);

};

int Graf :: dfs_cuplaj_maxim(int x, vector <int> &vizitat, int v1[], int v2[])
{
    if(vizitat[x])
        return 0;

    vizitat[x] = 1;

    vector <int> :: iterator j;

    for(j = lista_adiacenta[x].begin(); j < lista_adiacenta[x].end(); j++)
        if(!v2[*j])
    {
        v1[x] = *j;
        v2[*j] = x;
        return 1;
    }

    for(j = lista_adiacenta[x].begin(); j < lista_adiacenta[x].end(); j++)
        if(dfs_cuplaj_maxim(v2[*j], vizitat, v1, v2))
    {
        v2[*j] = x;
        v1[x] = *j;
        return 1;
    }
    return 0;
}

void Graf :: cuplaj_maxim_initializare()
{
    int cardinal_multime_1, cardinal_multime_2, capat_stang, capat_drept;

    fin >> cardinal_multime_1 >> cardinal_multime_2 >> numar_muchii;

    vector <int> vizitat;
    vector <pair<int, int>> cuplaj_maxim;
    int v1[cardinal_multime_1 + 1] = {}, v2[cardinal_multime_2 + 1] = {}, ok = 1;

    for(int i = 0; i < cardinal_multime_1; i++)
        vizitat.push_back(0);

    lista_adiacenta.resize(cardinal_multime_1 + 1);

    for(int i = 0; i < numar_muchii; i++)
    {
        fin >> capat_stang >> capat_drept;
        lista_adiacenta[capat_stang].push_back(capat_drept);
    }

    while(ok)
    {
        ok = 0;

        for(int i = 0; i < vizitat.size(); i++)
            vizitat[i] = 0;

        for(int i = 1; i <= cardinal_multime_1; i++)
            if(!v1[i])
                if(dfs_cuplaj_maxim(i, vizitat, v1, v2) == 1)
                    ok = 1;
    }

    for(int i = 1; i <= cardinal_multime_1; i++)
        if(v1[i])
            cuplaj_maxim.push_back(make_pair(i, v1[i]));

    fout << cuplaj_maxim.size() << '\n';

    for(int i = 1; i < cuplaj_maxim.size(); i++)
        fout << cuplaj_maxim[i].first << " " << cuplaj_maxim[i].second << '\n';

    lista_adiacenta.clear();
}

int main()
{
    Graf x;
    x.cuplaj_maxim_initializare();

    fin.close();
    fout.close();

    return 0;
}