Cod sursa(job #1969571)

Utilizator akaprosAna Kapros akapros Data 18 aprilie 2017 15:33:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
#define maxN 20002
using namespace std;

FILE *fin = freopen("cuplaj.in", "r", stdin);
FILE *fout = freopen("cuplaj.out", "w", stdout);

/* ==================== */
int n, m, e;
/* ==================== */
vector < int > V[maxN];
bool vis[maxN];
int Pair[maxN];
/* ==================== */
struct Matching
{
    int x, y;
} ans[maxN];
int len;
/* ==================== */

bool PairUp(int x)
{
    if (vis[x])
        return 0;
    vis[x] = 1;
    for (int y : V[x])
        if (Pair[y] == -1 || PairUp(Pair[y]))
        {
            Pair[x] = y;
            Pair[y] = x;
            return 1;
        }
    return 0;
}

int main()
{
    scanf("%d %d %d", &n, &m, &e);
    for (int i = 1; i <= e; ++ i)
    {
        int x, y;
        scanf("%d %d", &x, &y);
        V[x].push_back(y + n);
        V[y + n].push_back(x);
    }
    for (int i = 1; i <= n + m; ++ i)
        Pair[i] = -1;

    bool ok = 0;
    do
    {
        ok = 0;
        memset(vis, 0, sizeof(vis));
        for (int i = 1; i <= n; ++ i)
            if (Pair[i] == -1)
                ok |= PairUp(i);
    }
    while (ok);

    for (int i = 1; i <= n; ++ i)
        if (Pair[i] != -1)
            ans[++ len] = {i, Pair[i] - n};
    printf("%d\n", len);
    for (int i = 1; i <= len; ++ i)
        printf("%d %d\n", ans[i].x, ans[i].y);
    return 0;
}