Cod sursa(job #3220178)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 2 aprilie 2024 18:10:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 kb
#ifndef LOCAL
    #pragma GCC optimize("O3")
    #pragma GCC target("avx2")
#endif

#ifdef LOCAL
    #define _GLIBCXX_DEBUG
#endif

#include <bits/stdc++.h>
#define pb push_back
#define pii pair<int, int>
using ll = long long;
using ci = const int;
using cll = const long long;

using namespace std;

const int NMAX = 1e4 + 5;
/*******************************/
// INPUT / OUTPUT

#ifndef LOCAL
    ifstream in("cuplaj.in");
    ofstream out("cuplaj.out");
    #define cin in
    #define cout out
#endif
/*******************************/
/// GLOBAL DECLARATIONS

int N, M, K;
int ans;
bool vis[NMAX];
int st[NMAX], dr[NMAX];

vector <int> adj[NMAX];
/*******************************/
/// FUNCTIONS

void ReadInput();
void Solution();
void Output();
/*******************************/
///-------------------------------------
inline void ReadInput()
{
    cin >> N >> M >> K;

    int a, b;
    for (int i = 0 ; i < K ; ++ i)
    {
        cin >> a >> b;

        adj[a].push_back(b);
    }
}
///-------------------------------------
inline bool cupleaza(int node)
{
    if (vis[node]) return false;

    vis[node] = true;
    for (auto u: adj[node])
    {
        if (!st[u])
        {
            dr[node] = u;
            st[u] = node;
            return true;
        }
    }

    for (auto u: adj[node])
    {
        if (st[u] && cupleaza(st[u]))
        {
            dr[node] = u;
            st[u] = node;
            return true;
        }
    }

    return false;
}
///-------------------------------------
inline void Solution()
{

    bool run = true;
    while (run)
    {
        for (int i = 1 ; i <= N ; ++ i)
            vis[i] = false;

        run = false;
        for (int i = 1 ; i <= N ; ++ i)
        {
            if (!dr[i] && cupleaza(i))
            {
                ans ++;
                run = true;
            }
        }
    }
}
///-------------------------------------
inline void Output()
{
    cout << ans << "\n";
    for (int i = 1 ; i <= N ; ++ i)
        if (dr[i])
            cout << i << " " << dr[i] << "\n";
}
///-------------------------------------
int main()
{
    #ifndef LOCAL
        ios::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
    #endif
    ReadInput();
    Solution();
    Output();
    return 0;
}