Cod sursa(job #1914484)

Utilizator calin1Serban Calin calin1 Data 8 martie 2017 17:09:38
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <cstdio>
#include <bitset>
#include <vector>
#define N 10005

using namespace std;

int n, m, L[N], R[N], ok;

vector <int> G[N];

bitset <N> viz;

int cuplaj(int x)
{
    if(viz[x])
    {
        return 0;
    }

    viz[x] = true;

    vector <int>::iterator it;

    for(it = G[x].begin() ; it != G[x].end() ; ++it)
    {
        if(!L[*it] || cuplaj(L[*it]))
        {
            R[x] = *it;
            L[*it] = x;

            return 1;
        }
    }

    return 0;
}

void afisare()
{
    int nr = 0;

    for(int i = 1 ; i <= n ; ++i)
    {
        if(R[i])
        {
            nr++;
        }
    }

    printf("%d\n",nr);

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

void citire()
{
    int tmp;

    scanf("%d %d %d\n",&n,&m,&tmp);

    int a, b;

    for(int i = 0 ; i < tmp ; ++i)
    {
        scanf("%d %d\n",&a,&b);

        G[a].push_back(b);
    }

    ok = 1;

    while(ok)
    {
        ok = 0;

        viz.reset();

        for(int i = 1 ; i <= n ; ++i)
        {
            if(!R[i])
            {
                ok = cuplaj(i);
            }
        }
    }

    afisare();
}

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

    citire();

    return 0;
}