Cod sursa(job #2962450)

Utilizator elenaaa15Dobre Elena elenaaa15 Data 8 ianuarie 2023 16:44:56
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb

// Created by elena on 1/8/2023.

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

vector<int> graf[20001];
bool visited[20001];
int parent[20001];

//fac cuplajul partitiilor:

bool cuplaj(int nod)
{
    visited[nod] = true;
    for(int vecin : graf[nod])
    {
        // daca un vecin al nodului curent nu a fost inca cuplat, formez pereche:
        if(parent[vecin] == 0)
        {
            parent[nod] = vecin;
            parent[vecin] = nod;
            return true; //cuplat
        }

        //la a doua parcurgere incercam sa cuplam nodul necuplat
        if(visited[parent[vecin]]==false && cuplaj(parent[vecin]))
        {
            parent[nod] = vecin;
            parent[vecin] = nod;
            return true; //cuplat
        }
    }
    return false; //necuplat
}

int main()
{
    int n, m, e, x, y, c = 0;
    bool cuplat = true;
    f>>n>>m>>e;

    for(int i = 0; i < e; i++)
    {
        f>>x>>y;
        y += n; //+n pt diferentierea nodurilor din partitii care au aceeasi valoare
        //se scade n la final la afisarea perechilor
        graf[x].push_back(y);
    }


    do
    {
        cuplat = false;

        for(int i = 1; i <= n; i++)
            //caut nodurile necuplate:

            if(!visited[i] && !parent[i] && cuplaj(i))
            {
                c++;
                cuplat = true;
            }
        // reinit vectorul de vizitati pentru a mai incerca o data cuplajul nodurilor ramase
        for(int i = 1; i <= n + m; i++)
            visited[i] = false;

    }while(cuplat);

    g << c << '\n';

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