Cod sursa(job #2961990)

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

using namespace std;

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

vector<vector<int>> bp;

int n,m,e;

bool 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))
            {
                left[j] = leftNode;
                return true;
            }
        }
    }
    return false;
}


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

        if(bpm(i,visited, left)==true)
            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;
}