Cod sursa(job #2886105)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 6 aprilie 2022 23:19:12
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;

const int NMAX = 1e4;

int pairs[2][NMAX + 1];    // 0 e graful din stanga, 1 e cel din dreapta
bool vis[NMAX];
vector<int> adj[2][NMAX + 1];

bool change(int nd);
void match(int n, int m);

int main()
{
    int n, m, nd1, nd2, E;

    FILE *fin = fopen("cuplaj.in", "r");
    fscanf(fin, "%d%d%d", &n, &m, &E);
    for (int i = 0; i < E; i++) {
        fscanf(fin, "%d%d", &nd1, &nd2);
        adj[0][nd1].push_back(nd2);
        adj[1][nd2].push_back(nd1);
    }
    fclose(fin);

    match(n, m);

    int cnt = 0;
    for (int i = 1; i <= n; i++)
        cnt += (pairs[0][i] != 0);


    FILE *fout = fopen("cuplaj.out", "w");
    fprintf(fout, "%d\n", cnt);
    for (int i = 1; i <= n; i++)
        if (pairs[0][i])
            fprintf(fout, "%d %d\n", i, pairs[0][i]);
    fclose(fout);
    return 0;
}

bool change(int nd) {
    vis[nd] = 1;

    for (int nxt: adj[0][nd]) {
        if (!pairs[1][nxt]) {
            pairs[1][nxt] = nd;
            pairs[0][nd] = nxt;
            return 1;
        }
    }

    for (int nxt: adj[0][nd]) {
        if (!vis[pairs[1][nxt]] && change(pairs[1][nxt])) {
            pairs[1][nxt] = nd;
            pairs[0][nd] = nxt;
            return 1;
        }
    }
    return 0;
}
void match(int n, int m) {
    bool ok = 1;
    while (ok) {
        for (int i = 1; i <= n; i++)
            vis[i] = 0;

        ok = 0;
        for (int nd = 1; nd <= n; nd++)
            if (!pairs[0][nd])
                ok |= change(nd);
    }
}