Cod sursa(job #2556614)

Utilizator KappaClausUrsu Ianis Vlad KappaClaus Data 25 februarie 2020 07:31:04
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

const int NM_MAX = 1e4 + 1;

int LEFT[NM_MAX], RIGHT[NM_MAX];
bool VISITED[NM_MAX];

vector<vector<int>> GRAPH(NM_MAX, vector<int>());
int N, M, E;

bool pair_up(int l_node)
{
    if(VISITED[l_node] == true) return false;

    VISITED[l_node] = true;

    for(auto& r_node : GRAPH[l_node])
    {
        if(LEFT[r_node] == 0)
        {
            LEFT[r_node] = l_node;
            RIGHT[l_node] = r_node;

            return true;
        }
    }

    for(auto& r_node : GRAPH[l_node])
    {
        if(pair_up(LEFT[r_node]) == true)
        {
            LEFT[r_node] = l_node;
            RIGHT[l_node] = r_node;

            return true;
        }
    }

    return false;
}
int main()
{
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");

    fin >> N >> M >> E;

    for(int i = 1; i <= E; ++i)
    {
        int l_node, r_node;
        fin >> l_node >> r_node;

        GRAPH[l_node].push_back(r_node);
    }

    int coupling_cardinal = 0;

    bool no_changes = false;

    while(no_changes == false)
    {
        for(int i = 1; i <= N; ++i)
            VISITED[i] = false;

        no_changes = true;

        for(int i = 1; i <= N; ++i)
        {
            if(RIGHT[i] == 0 && pair_up(i))
            {
                no_changes = false;
                coupling_cardinal++;
            }
        }
    }

    fout << coupling_cardinal << '\n';

    for(int i = 1; i <= N; ++i)
    {
        if(RIGHT[i] != 0 )
        {
            fout << i << ' ' << RIGHT[i] << '\n';
        }
    }
}