Cod sursa(job #2961989)

Utilizator Eronatedudu zzz Eronate Data 7 ianuarie 2023 16:02:03
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

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

vector<vector<int>> bp;

int n,m,e;

int bpm(int leftNode, bool visited[], int left[])
{
    for(auto j: bp[leftNode]) //iau fiecare valoare din dreapta care are muchie cu nodul meu din stanga
    {
        if(!visited[j])
        {
            visited[j] = true;
            //daca nodul din dreapta inca nu are cuplaj,
            //sau daca pot gasi un alt cuplaj pentru nodul din stanga care are cuplaj
            //cu nodul meu curent din dreapta
            if(left[j]<0 || bpm(left[j], visited, left) != -1)
            {
                left[j] = leftNode;
                return j;
            }
        }
    }

    return -1;
}


int maxMatch(int left[])
{

    memset(left, -1, sizeof(left)); //-1 inseamna ca nodul din dreapta nu are inca cuplaj

    int res=0;
    for(int i=1; i<=n; i++)
    {
        bool visited[m]; //vector in care retin nodurile din dreapta incercate pentru i
        memset(visited, 0, sizeof(visited));
        int j =  bpm(i,visited, left);
        if(j != -1)
            res++;
    }
    return res;
}

int main()
{
    int lft, rig, left[10001];


    bp.resize(10001);
    f>>n>>m>>e;
    for(int i=1;i<=m;i++)
        left[i]= -1;
    for(int i=1;i<=e;i++)
    {
        f>>lft>>rig;
        bp[lft].push_back(rig);
    }
    g<<maxMatch(left)<<'\n';

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