Cod sursa(job #2958612)

Utilizator mihairazvan03Dana Mihai mihairazvan03 Data 27 decembrie 2022 11:41:32
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>

using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

int n, m, cuplajMax;
vector<int> st, dr, dist;
vector<vector<int>> adj;
queue<int> coada;

bool BFS()
{
    int i, currentNode, j;

    for(i = 1 ; i <= n ; i++)
        if(dr[i] == 0)
            {
                dist[i] = 0;
                coada.push(i);
            }
        else
            dist[i] = INT_MAX;

    dist[0] = INT_MAX;

    while(!coada.empty())
    {
        currentNode = coada.front();
        coada.pop();

        if(dist[currentNode] < dist[0])
        {
            for(j = 0; j < adj[currentNode].size(); j++)
            {
                if(dist[st[adj[currentNode][j]]] == INT_MAX)
                {
                    dist[st[adj[currentNode][j]]] = dist[currentNode] + 1;
                    coada.push(st[adj[currentNode][j]]);
                }
            }
        }
    }

    return dist[0] != INT_MAX;
}

bool DFS(int currentNode)
{
    int i;

    if(currentNode != 0)
    {
        for(i = 0; i < adj[currentNode].size(); i++)
            if(dist[currentNode] + 1 == dist[st[adj[currentNode][i]]] && DFS(st[adj[currentNode][i]]))
            {
                st[adj[currentNode][i]] = currentNode;
                dr[currentNode] = adj[currentNode][i];
                return true;
            }
        dist[currentNode] = INT_MAX;

        return false;
    }

    return true;
}

void HopcroftKarp()
{
    int i;

    while(BFS())
        for(i = 1 ; i <= n ; i++)
            if(dr[i] == 0 && DFS(i))
                cuplajMax++;
}

int main()
{
    int i, nod1, nod2, e;

    in >> n >> m >> e;
    st.resize(n + 1, 0);
    dr.resize(n + 1, 0);
    adj.resize(n + m + 1);
    dist.resize(n + 1, 0);

    for(i = 1 ; i <= e ; i++)
    {
        in >> nod1 >> nod2;
        adj[nod1].push_back(nod2);
    }

    HopcroftKarp();

    out << cuplajMax << '\n';

    for(i = 1 ; i <= m ; i++)
        if(st[i] != 0)
            out << st[i] << " " << i << '\n';

    return 0;
}