Cod sursa(job #3266223)

Utilizator stefan0211Tacu Darius Stefan stefan0211 Data 6 ianuarie 2025 17:14:33
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.22 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

int n, m, s, t, e;

vector<vector<int>> la;
vector<vector<int>> capacitate, flux;
vector<int> tata;

void Read()
{
    f >> n >> m >> e;
    s = 0;         // sursa
    t = n + m + 1; // destinația
    la.resize(n + m + 2);
    capacitate.resize(n + m + 2, vector<int>(n + m + 2, 0));
    flux.resize(n + m + 2, vector<int>(n + m + 2, 0));
    tata.resize(n + m + 2, -1);

    int x, y;
    for (int i = 1; i <= e; i++)
    {
        f >> x >> y;
        la[x].push_back(n + y);
        la[n + y].push_back(x);
        capacitate[x][n + y] = 1;
    }

    for (int i = 1; i <= n; i++)
    {
        la[s].push_back(i);
        la[i].push_back(s);
        capacitate[s][i] = 1;
    }

    for (int i = 1; i <= m; i++)
    {
        la[n + i].push_back(t);
        la[t].push_back(n + i);
        capacitate[n + i][t] = 1;
    }
}

bool ConstruiesteDrumBF()
{
    vector<bool> viz(n + m + 2, false);
    queue<int> q;
    q.push(s);
    viz[s] = true;
    tata.assign(n + m + 2, -1);

    while (!q.empty())
    {
        int nod = q.front();
        q.pop();

        for (int vecin : la[nod])
        {
            if (!viz[vecin] && capacitate[nod][vecin] > flux[nod][vecin])
            {
                q.push(vecin);
                viz[vecin] = true;
                tata[vecin] = nod;

                if (vecin == t)
                    return true;
            }
        }
    }
    return false;
}

int main()
{
    Read();
    int flow = 0;

    while (ConstruiesteDrumBF())
    {
        int fmin = INT_MAX;

        for (int nod = t; nod != s; nod = tata[nod])
        {
            fmin = min(fmin, capacitate[tata[nod]][nod] - flux[tata[nod]][nod]);
        }

        for (int nod = t; nod != s; nod = tata[nod])
        {
            flux[tata[nod]][nod] += fmin;
            flux[nod][tata[nod]] -= fmin;
        }

        flow += fmin;
    }

    g << flow << '\n';
    for (int u = 1; u <= n; u++)
    {
        for (int v : la[u])
        {
            if (flux[u][v] == 1)
            {
                g << u << ' ' << v - n << '\n';
            }
        }
    }

    return 0;
}