Cod sursa(job #1402245)

Utilizator radarobertRada Robert Gabriel radarobert Data 26 martie 2015 13:45:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

vector<int> g[10002];
int l[10002], r[10002];
bool vis[10002];

bool PairUp(int node)
{
    if (vis[node])
        return false;
    vis[node] = true;
    for (int i = 0; i < g[node].size(); i++)
    {
        if (r[g[node][i]] == 0 || PairUp(r[g[node][i]]))
        {
            r[g[node][i]] = node;
            l[node] = g[node][i];
            return true;
        }
    }
    return false;
}

int main()
{
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);

    int n, m, e;
    scanf("%d%d%d", &n, &m, &e);
    for (int x, y; e; e--)
    {
        scanf("%d%d", &x, &y);
        g[x].push_back(y);
    }

    bool ok = true;
    int sol = 0;
    while (ok)
    {
        memset(vis, 0, sizeof(bool) * (n+1));
        ok = false;
        for (int i = 1; i <= n; i++)
            if (l[i] == 0)
                if (PairUp(i))
                {
                    sol++;
                    ok = true;
                }
    }

    printf("%d\n", sol);
    for (int i = 1; i <= n; i++)
        if (l[i])
            printf("%d %d\n", i, l[i]);

    return 0;
}