Cod sursa(job #3221687)

Utilizator AswVwsACamburu Luca AswVwsA Data 7 aprilie 2024 20:10:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.75 kb
#include <fstream>
#include <algorithm>
#include <cassert>
#include <vector>
#include <queue>
#define ll long long
using namespace std;

const int NMAX = 10000;

ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");

struct matching
{
    int l, r;
    vector <int> g[NMAX + 1];
    int fren[NMAX + 1][2];
    int d[NMAX + 1];

    void add(int a, int b)
    {
        g[a].push_back(b);
    }

    bool sepoate()
    {
        queue <int> q;
        int i;
        for (i = 1; i <= l; i++)
        {
            d[i] = 0;
            if (fren[i][0] == 0)
            {
                q.push(i);
                d[i] = 1;
            }
        }
        bool ans = 0;
        while (!q.empty())
        {
            int f = q.front();
            q.pop();
            for (int x : g[f])
            {
                if (fren[x][1] == 0)
                {
                    ans = 1; //exista drumul de
                    //augmentare de cel putin o muchie
                }
                else if (d[fren[x][1]] == 0)
                {
                    d[fren[x][1]] = d[f] + 1;
                    q.push(fren[x][1]);
                }
            }
        }
        return ans;
    }

    bool dfs(int nod)
    {
        for (int x : g[nod])
        {
            int nxt = fren[x][1];
            if (nxt == 0)
            {
                fren[nod][0] = x;
                fren[x][1] = nod;
                return 1;
            }
            else if (d[nxt] == d[nod] + 1)
            {
                bool really = dfs(nxt);
                if (really)
                {
                    fren[nod][0] = x;
                    fren[x][1] = nod;
                    return 1;
                }
            }
        }
        d[nod] = 0;
        return 0;
    }

    int ans()
    {
        int i;
        for (i = 1; i <= l; i++)
        {
            fren[i][0] = 0;
        }
        for (i = 1; i <= r; i++)
            fren[i][1] = 0;
        int rez = 0;
        while (sepoate())
        {
            for (i = 1; i <= l; i++)
                if (fren[i][0] == 0)
                {
                    rez += dfs(i);
                }
        }
        return rez;
    }

    void print_sol()
    {
        cout << ans() << "\n";
        int i;
        for (i = 1; i <= l; i++)
            if (fren[i][0])
                cout << i << ' ' << fren[i][0] << '\n';
    }
};

matching cuplaj;


signed main()
{
    ios_base :: sync_with_stdio(0);
    cin.tie(0);
    int n, m, e;
    cin >> n >> m >> e;
    cuplaj.l = n;
    cuplaj.r = m;
    while (e--)
    {
        int a, b;
        cin >> a >> b;
        cuplaj.add(a, b);
    }
    cuplaj.print_sol();
}