Cod sursa(job #3227150)

Utilizator Victor2006Nicola Victor-Teodor Victor2006 Data 26 aprilie 2024 01:20:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <utility>
#include <vector>
#define N1 10000
#define N2 10000

std::vector <std::pair <int, int>> ans;
std::vector <int> vecini[1 + N1];
int cuplat_1[N1], cuplat_2[N2];
bool parcurs[N2];
int n1, n2;

bool exista_drum(int nod) {
    for ( int vecin : vecini[nod] ) {
        if ( !parcurs[vecin] ) {
            parcurs[vecin] = true;
            if ( cuplat_2[vecin] == 0 ) {
                cuplat_1[nod] = vecin;
                cuplat_2[vecin] = nod;
                return true;
            }
            if ( exista_drum(cuplat_2[vecin]) ) {
                cuplat_1[nod] = vecin;
                cuplat_2[vecin] = nod;
                return true;
            }
        }
    }
    return false;
}

int main() {
    FILE *fin, *fout;
    int m, x, y;

    fin = fopen("cuplaj.in", "r");
    fscanf(fin, "%d%d%d", &n1, &n2, &m);
    for ( int i = 0; i < m; i ++ ) {
        fscanf(fin, "%d%d", &x, &y);
        vecini[x].push_back(y);
    }
    fclose(fin);

    bool ok = true;
    while ( ok ) {
        ok = false;
        for ( int i = 1; i <= n2; i ++ )
            parcurs[i] = false;
        for ( int i = 1; i <= n1; i ++ )
            if ( !cuplat_1[i] && exista_drum(i) )
                ok = true;
    }

    for ( int i = 1; i <= n1; i ++ )
        if ( cuplat_1[i] )
            ans.push_back({i, cuplat_1[i]});

    fout = fopen("cuplaj.out", "w");
    fprintf(fout, "%zu\n", ans.size());
    for ( std::pair <int, int>& p : ans )
        fprintf(fout, "%d %d\n", p.first, p.second);
    fclose(fout);
    return 0;
}