Cod sursa(job #1380083)

Utilizator DenisacheDenis Ehorovici Denisache Data 6 martie 2015 21:48:13
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int n,m,cnt,l[10005],r[10005];
vector <int> G[10005];
bool u[10005];
#define pb push_back
int pair_up(int nod)
{
    if (u[nod]) return 0;
    u[nod]=true;
    for (vector<int>::iterator it=G[nod].begin();it!=G[nod].end();it++)
    {
        if (!r[*it])
        {
            l[nod]=*it;
            r[*it]=nod;
            return 1;
        }
    }
    for (vector<int>::iterator it=G[nod].begin();it!=G[nod].end();it++)
    {
        if (pair_up(r[*it]))
        {
            l[nod]=*it;
            r[*it]=nod;
            return 1;
        }
    }
    return 0;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d %d %d",&n,&m,&cnt);
    int x,y;
    while (cnt--)
    {
        scanf("%d %d",&x,&y);
        G[x].pb(y);
    }
    for (int change=1;change;)
    {
        change=0;
        memset(u,false,sizeof(u));
        for (int i=1;i<=n;i++)
            if (!l[i]) change|=pair_up(i);
    }
    int cuplaj=0;
    for (int i=1;i<=n;i++) if (l[i]) cuplaj++;
    printf("%d",cuplaj);
    for (int i=1;i<=n;i++)
        if (l[i])
            printf("\n%d %d",i,l[i]);
    return 0;
}