Cod sursa(job #921391)

Utilizator andrettiAndretti Naiden andretti Data 20 martie 2013 22:57:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<stdio.h>
#include<vector>
#define pb push_back
#define maxn 10005
using namespace std;

int n,m,p,ok,nr,sol;
int lt[maxn],rt[maxn],v[maxn];
vector <int> l[maxn];

void cit()
{
    int i;
    int x,y;

    scanf("%d%d%d",&n,&m,&p);
    for(i=1;i<=p;i++)
    {
        scanf("%d%d",&x,&y);
        l[x].pb(y);
    }
}

int new_pair(int k)
{
    if(v[k]==nr) return 0;
    v[k]=nr;

    for(unsigned int i=0;i<l[k].size();i++)
        if(rt[l[k][i]]==0)
        {
            lt[k]=l[k][i];
            rt[l[k][i]]=k;
            return 1;
        }

    for(unsigned int i=0;i<l[k].size();i++)
        if(new_pair(rt[l[k][i]]))
        {
            lt[k]=l[k][i];
            rt[l[k][i]]=k;
            return 1;
        }
    return 0;
}

void solve()
{
    int i;

    ok=1;
    while(ok)
    {
        ok=0; nr++;
        for(i=1;i<=n;i++)
            if(lt[i]==0)
                if(new_pair(i))
                 ok=1,sol++;
    }
}

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

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

    cit();
    solve();
    afis();

    fclose(stdin);
    fclose(stdout);
    return 0;
}