Cod sursa(job #2965864)

Utilizator cosminnnnnnnaDuca Cosmina cosminnnnnnna Data 16 ianuarie 2023 13:52:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <bits/stdc++.h>
using namespace std;

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

//algoritmul lui Hopcroft Karp

int noduriL, noduriR, nrMuchii;
int distanta[20001], l[20001], r[20001];
vector<int> graf[20001];
queue<int> q;


bool bfs() {
    
    for (int i = 1; i <= noduriL; i++)
        if (!r[i]) {
            ///daca e liber, il bagam in coada
            q.push(i);
            distanta[i] = 0;
        }
        else 
            distanta[i] = INT_MAX;
    distanta[0] = INT_MAX;
    while (!q.empty()) {
        int node = q.front();
        q.pop();
        
        if (distanta[node] < distanta[0])         {
            for (auto urm: graf[node]) {
                if (distanta[l[urm]] == INT_MAX)                 {
                    distanta[l[urm]] = 1 + distanta[node];
                    q.push(l[urm]);
                }
            }
        }
    }
    return distanta[0] != INT_MAX; ///lant
}

bool dfs(int node)
{
    if(node != 0)
    {
        for(auto nextNod : graf[node])
            if(distanta[node] + 1 == distanta[l[nextNod]] && dfs(l[nextNod]))
            {
                l[nextNod] = node;
                r[node] = nextNod;
                return true;
            }

        distanta[node] = INT_MAX;
        return false;
    }
    return true;
}

int makePair()
{
    int cuplaMax = 0;

    while(bfs())
    {
        for(int i = 1 ; i <= noduriL ; i++)
            if(!r[i] && dfs(i))
                cuplaMax++;
    }

    return cuplaMax;
}


int main(){

    fin >> noduriL >> noduriR >> nrMuchii;

    
    fill(l, l + 20001, 0);
    fill(r, r + 20001, 0);

    for(int i = 1 ; i <= nrMuchii ; i++)
    {
        int u, v;
        fin >> u >> v;
        graf[u].push_back(v);
    }

    fout << makePair() << endl;

    for(int i = 1 ; i <= noduriR ; i++)
        if(l[i])
            fout << l[i] << ' ' << i << endl;

    return 0;
}