Cod sursa(job #1914325)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 8 martie 2017 16:28:04
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>
#include <algorithm>
#define MAXN 10005
using namespace std;

int n, m, e;
int l[MAXN], r[MAXN];
vector<int> graf[MAXN];
bitset<MAXN> viz;

void citire()
{
    scanf("%d %d %d ",&n,&m,&e);
    for(int i=1;i<=e;i++)
    {
        int a, b;
        scanf("%d %d",&a,&b);
        graf[a].push_back(b);
    }
}

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

    viz[x]=1;

    for(auto it = graf[x].begin(); it != graf[x].end(); ++it)
        if(!r[*it] || cuplaj(r[*it]))
        {
            l[x]=*it;
            r[*it]=x;
            return 1;
        }

    return 0;
}

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

    citire();

    int ok = 1;

    while(ok)
    {
        viz.reset();
        ok=0;
        for(int i=1;i<=n;i++)
            if(!l[i])
                ok |= cuplaj(i);
    }

    int nr = 0;

    for_each(l+1,l+n+1,[&](int x){ if(x) nr++; });

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

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

    return 0;
}