Cod sursa(job #1413628)

Utilizator zpaePopescu Andreea zpae Data 1 aprilie 2015 23:34:19
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
#define N  10005
vector <int> v[N];
int a[N],b[N],u[N];

int pairup(const int n)
{
    if(u[n])
        return 0;
    int i;
    u[n]=1;
    for(i=0;i<v[n].size();i++)
        if(!b[v[n][i]])
        {
            a[n]=v[n][i];
            b[v[n][i]]=n;
            return 1;
        }
    for(i=0;i<v[n].size();i++)
        if(pairup(b[v[n][i]]))
        {
            a[n]=v[n][i];
            b[v[n][i]]=n;
            return 1;
        }
    return 0;
}

int main(void)
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    int n,m,i,k,x,y;
    scanf("%d%d%d",&n,&m,&k);
    while(k--)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
    }
    k=1;
    while(k)
    {
        k=0;
        memset(u,0,sizeof(u));
        for(i=1;i<=n;i++)
            if(!a[i]&&pairup(i))
                k=1;
    }
    k=0;
    for(i=1;i<=n;i++)
        if(a[i]>0)
            k++;
    printf("%d\n",k);
    for(i=1;i<=n;i++)
        if(a[i]>0)
            printf("%d %d\n",i,a[i]);
    return 0;
}