Cod sursa(job #1618802)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 28 februarie 2016 00:15:44
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <iostream>
#include <bitset>
#include <vector>
#define nmax 10000
using namespace std;

int a[nmax],b[nmax];
int l,r,m1,nrcon;
bitset<nmax> u;
vector<int> m[nmax];

int con(int nod)
{
    int i;
    if(u[nod]) return 0;
    u[nod]=1;
    for(i=0;i<m[nod].size();i++)
        if(!b[m[nod][i]])
        {
            if(!a[nod]) nrcon++;
            b[m[nod][i]]=nod;
            a[nod]=m[nod][i];
            return 1;
        }
    for(i=0;i<m[nod].size();i++)
        if(con(b[m[nod][i]]))
        {
            if(!a[nod]) nrcon++;
            b[m[nod][i]]=nod;
            a[nod]=m[nod][i];
            return 1;
        }
    return 0;
}


int main()
{
    freopen("cuplaj.in","r",stdin);
    //freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&l,&r,&m1);
    int n1,n2,i,change;
    for(;m1;m1--)
    {
        scanf("%d%d",&n1,&n2);
        m[n1].push_back(n2);
    }
    change=1;
    while(change)
    {
        change=0;
        for(i=1;i<=l;i++) u[i]=0;
        for(i=1;i<=l;i++) if(!b[i]) change|=con(i);
    }
    printf("%d\n",nrcon);
    for(i=1;i<=l;i++)
        if(a[i]) printf("%d %d\n",i,a[i]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}