Cod sursa(job #2572027)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 5 martie 2020 11:17:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
using namespace std;

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

const int CARD_MAX = 1e4 + 1;

int N, M, E, L[CARD_MAX], R[CARD_MAX];
bool used[CARD_MAX];

vector<vector<int>> graph(CARD_MAX, vector<int>());


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

    used[left_node] = true;

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

            return true;
        }
    }

     for(auto& right_node : graph[left_node])
    {
        if(pair_up(L[right_node]) == true)
        {
            L[right_node] = left_node;
            R[left_node] = right_node;

            return true;
        }
    }

    return false;
}


int main()
{
    fin >> N >> M >> E;

    for(int i = 1; i <= E; ++i)
    {
        int u, v;
        fin >> u >> v;

        graph[u].push_back(v);
    }


    int coupling_cardinal = 0;

    bool no_change = false;

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

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

        for(int i = 1; i <= N; ++i)
        {
            if(R[i] != 0) continue;

            if(pair_up(i) == true)
            {
                no_change = false;
                ++coupling_cardinal;
            }
        }
    }

    fout << coupling_cardinal << '\n';

    for(int i = 1; i <= N; ++i)
    {
        if(R[i] == 0) continue;

        fout << i << ' ' << R[i] << '\n';
    }
}