Cod sursa(job #2556393)

Utilizator KappaClausUrsu Ianis Vlad KappaClaus Data 24 februarie 2020 21:07:20
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
#define NM_MAX 10000 + 1
using namespace std;

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

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

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

    VISITED[left_node] = true;

    for(auto& right_node : graph[left_node])
    {
        if(LEFT[right_node] == 0)
        {
            LEFT[right_node] = left_node;
            RIGHT[left_node] = right_node;

            return true;
        }
    }

    for(auto& right_node : graph[left_node])
    {
        if(pair_up(LEFT[right_node]) == true)
        {
            LEFT[right_node] = left_node;
            RIGHT[left_node] = right_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 left_node, right_node;
        fin >> left_node >> right_node;

        graph[left_node].push_back(right_node);
    }

    int cardinal = 0;

    bool no_changes = false;

    while(no_changes == false)
    {
        no_changes = true;

        fill(VISITED + 1, VISITED + N + 1, false);

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

    fout << cardinal << '\n';

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