Cod sursa(job #2784917)

Utilizator guzgandemunteIonescu Laura guzgandemunte Data 17 octombrie 2021 18:16:04
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <cstdlib>
#define NMAX 10000
#define MMAX 10000

using namespace std;

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

int N, M, E, x, y;
bool adj[MMAX][NMAX];
bool visited[NMAX];
int assignTask[NMAX];

bool bipartiteMatch(int u)
{
    for (int v = 0; v < N; ++v)
        if (adj[u][v] && !visited[v])
        {
            visited[v] = true;
            if (assignTask[v] < 0 || bipartiteMatch(assignTask[v]))
            {
                assignTask[v] = u;
                return true;
            }
        }
    return false;
}

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

    for (int i = 0; i < E; ++i)
    {
        fin >> x >> y;
        adj[x - 1][y - 1] = 1;
    }

    for (int i = 0; i < N; ++i)
        assignTask[i] = -1;

    int jobCount = 0;

    for (int u = 0; u < M; ++u) // all applicants
    {
        for (int i = 0; i < N; ++i) visited[i] = false;
        if (bipartiteMatch(u)) jobCount++;
    }

    fout << jobCount << endl;

    for (int i = 0; i < N; ++i)
    if (assignTask[i] != -1) fout << assignTask[i] + 1 << " " << i + 1 << endl;
}