Cod sursa(job #2960496)

Utilizator cilteaioanaIoana C cilteaioana Data 4 ianuarie 2023 15:21:23
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
//Algoritmul lui Hopcroft Karp 
//Complexitate: O(sqrt(V * E))
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits>

using namespace std;

int n, m, e;
vector<int> la[1001];
queue<int> q;
vector<int> st, dr, dist;

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

bool BFS() 
{
    for (int i = 1; i <= n; i++)
        if (!dr[i]) 
        {
            q.push(i);
            dist[i] = 0;
        }
        else
            dist[i] = INT_MAX;
    dist[0] = INT_MAX;
    //q = nodurile din parte stanga
    while (!q.empty()) 
    {
        int nod = q.front();
        q.pop();
        if (dist[nod] < dist[0])
        {
            for (auto urm : la[nod]) 
            {
                if (dist[st[urm]] == INT_MAX)
                {
                    dist[st[urm]] = 1 + dist[nod];
                    q.push(st[urm]);
                }
            }
        }
    }
    return dist[0] != INT_MAX; 
}
bool DFS(int nod)
{
    if (nod != 0)
    {
        for (auto urm : la[nod])
            if (1 + dist[nod] == dist[st[urm]] && DFS(st[urm]))
            {

                st[urm] = nod;
                dr[nod] = urm;
                return true;
            }
        dist[nod] = INT_MAX;
        return false;
    }
    return true;
}
int cuplajMax()
{
    int rez = 0;
    while (BFS())
    {
        for (int i = 1; i <= n; i++)
            if (!dr[i] && DFS(i))
                rez++;
    }
    return rez;
}
int main() 
{
    fin >> n >> m >> e;
    st.resize(n + 1, 0);
    dr.resize(n + 1, 0);
    dist.resize(n + 1, 0);
    for (int i = 1; i <= e; i++)
    {
        int n1, n2;
        fin >> n1 >> n2;
        la[n1].push_back(n2);
    }
    fout << cuplajMax() << '\n';
    for (int i = 1; i <= m; i++)
        if (st[i])
            fout << st[i] << ' ' << i << '\n';
    fin.close();
    fout.close();
    return 0;
}