Cod sursa(job #2777618)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 23 septembrie 2021 19:31:05
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#include <string.h>
#include <vector>
#define NMAX 10005

using namespace std;

/********************************/
/// INPUT / OUTPUT

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
/********************************/
/// GLOBAL DECLARATIONS

int N, M, E;
int ans;
int l[NMAX], r[NMAX];
bool visited[NMAX];
vector<int> adj[NMAX];
/********************************/
/// FUNCTIONS

void ReadInput();
void Solution();
void Output();
/********************************/
///--------------------------------------------
inline void ReadInput()
{
    f >> N >> M >> E;

    for (int i = 1; i <= E; ++i)
    {
        int u, v;
        f >> u >> v;
        adj[u].push_back(v);
    }
}
///--------------------------------------------
bool PairUp(int node)
{
    if (visited[node])
        return 0;
    visited[node] = 1;

    for (auto u : adj[node])
    {
        if (!l[u])
        {
            l[u] = node;
            r[node] = u;
            return 1;
        }
    }

    for (auto u : adj[node])
    {
        if (l[u] && PairUp(l[u]))
        {
            l[u] = node;
            r[node] = u;
            return 1;
        }
    }

    return 0;
}
///--------------------------------------------
inline void Solution()
{
    while (true)
    {
        bool run = false;
        memset(visited, 0, sizeof(visited));
        for (int i = 1; i <= N; ++i)
        {
            if (!r[i] && PairUp(i))
            {
                run = true;
                ans ++;
            }
        }
        if (!run)
            break;
    }
}
///--------------------------------------------
inline void Output()
{
    g << ans << "\n";

    for (int i = 1 ; i <= N ; ++ i)
        if (r[i]) g << i << " " << r[i] << "\n";
}
///--------------------------------------------
int main()
{
    ReadInput();
    Solution();
    Output();
    return 0;
}