Cod sursa(job #1534783)

Utilizator ZenusTudor Costin Razvan Zenus Data 23 noiembrie 2015 23:08:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 20000 + 10;

int n , m , e , a , b , i , change , nr;
vector < int > g[nmax];
int link[nmax] , ok[nmax];

bool can(int q)
{
    if (ok[q]) return false;
    ok[q] = true;

    for (int i = 0 ; i < g[q].size() ; ++i)
    {
        int nq = g[q][i];
        if (link[nq]) continue;

        link[q] = nq;
        link[nq] = q;
        return true;
    }

    for (int i = 0 ; i < g[q].size() ; ++i)
    {
        int nq = g[q][i];
        if (can(link[nq]))
        {
            link[q] = nq;
            link[nq] = q;
            return true;
        }
    }

    return false;
}

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

cin >> n >> m >> e;

for (i = 1 ; i <= e ; ++i)
{
    cin >> a >> b;
    b += n;
    g[a].push_back(b);
}

do
{
    change = false;
    memset(ok , 0 , sizeof(ok));

    for (i = 1 ; i <= n ; ++i)
    if (!link[i]) change |= can(i);

} while (change);

for (i = 1 ; i <= n ; ++i)
if (link[i]) nr += 1;

cout << nr << '\n';

for (i = 1 ; i <= n ; ++i)
if (link[i]) cout << i << " " << link[i] - n << '\n';

return 0;
}