Cod sursa(job #2956407)

Utilizator dragosteleagaDragos Teleaga dragosteleaga Data 19 decembrie 2022 15:09:59
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstring>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream o("cuplaj.out");
long long int n1, n2, m;
long long int raspuns[10000];
bool bpm(bool bpGraph[1000][1000], long long int u,
         bool seen[], long long int matchR[]) {
    for (long long int v = 0; v < n2; v++) {

        if (bpGraph[u][v] && !seen[v]) {
            seen[v] = true;


            if (matchR[v] < 0 || bpm(bpGraph, matchR[v],
                                     seen, matchR)) {
                matchR[v] = u;
                raspuns[u+1]=v+1;
                return true;
            }
        }
    }
    return false;
}
long long int maxBPM(bool bpGraph[1000][1000]) {
    long long int matchR[n2];
    memset(matchR, -1, sizeof(matchR));
    long long int result = 0;
    for (long long int u = 0; u < n1; u++) {
        // Mark all jobs as not seen
        // for next applicant.
        bool seen[n2];
        memset(seen, 0, sizeof(seen));

        // Find if the applicant 'u' can get a job
        if (bpm(bpGraph, u, seen, matchR))
            result++;
    }
    return result;
}
int main() {

    f >> n1 >> n2 >> m;
    bool bpGraph[1000][1000];
    memset(bpGraph, false, sizeof(bpGraph));
    for (long long int i = 1; i <= m; i++) {
        long long int nod1, nod2;
        f >> nod1 >> nod2;
        bpGraph[nod1 - 1][nod2 - 1] = true;
    }

    o << maxBPM(bpGraph)<<"\n";
    for(long long int i=1;i<10000;i++)
        if(raspuns[i])
            o<<i<<" "<<raspuns[i]<<"\n";

    return 0;
}