Cod sursa(job #1886426)

Utilizator gabib97Gabriel Boroghina gabib97 Data 20 februarie 2017 21:22:25
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#include <vector>
#include <string.h>

#define N 10005
using namespace std;

int n, m, e, p1[N], p2[N];
bool o[N];
vector<int> G[N];

int match(int s)
{
    int i;
    if (o[s]) return 0;
    o[s] = 1;
    for (i = 0; i < G[s].size(); i++)
        if (!p2[G[s][i]]) {
            p1[s] = G[s][i];
            p2[G[s][i]] = s;
            return 1;
        }
    for (i = 0; i < G[s].size(); i++)
        if (match(p2[G[s][i]])) {
            p1[s] = G[s][i];
            p2[G[s][i]] = s;
            return 1;
        }
    return 0;
}

int main()
{
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    scanf("%i%i%i", &n, &m, &e);
    int x, y, i;
    while (e--) {
        scanf("%i%i", &x, &y);
        G[x].push_back(y);
    }

    int cuplaj = 1;
    while (cuplaj) {
        cuplaj = 0;
        memset(o, 0, sizeof(o));
        for (i = 1; i <= n; i++)
            if (!p1[i]) cuplaj += match(i);
    }
    cuplaj = 0;
    for (i = 1; i <= n; i++)
        if (p1[i]) cuplaj++;

    printf("%i\n", cuplaj);
    for (i = 1; i <= n; i++)
        if (p1[i]) printf("%i %i\n", i, p1[i]);
    return 0;
}