Cod sursa(job #1410136)

Utilizator eustatiuDima Eustatiu eustatiu Data 30 martie 2015 21:19:10
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#include <vector>
#include <bitset>
using namespace std;
vector<int> G[10001];
bitset<10001>viz;
int v1[10001],v2[10001],x,y,i,ok,nr;
int n,m,e;
inline const int cuplaj (int &x)
{
    if (viz[x])
        return 0;
    viz[x]=1;
    for (vector<int>::iterator it=G[x].begin();it!=G[x].end();it++)
        if (!v2[*it])
        {
            v1[x]=*it;
            v2[*it]=x;
            return 1;
        }
    for (vector<int>::iterator it=G[x].begin();it!=G[x].end();it++)
        if (cuplaj(v2[*it]))
        {
            v1[x]=*it;
            v2[*it]=x;
            return 1;

        }
    return 0;
}
int main()
{
    freopen ("cuplaj.in","r",stdin);
    freopen ("cuplaj.out","w",stdout);
    scanf("%i%i%i",&n,&m,&e);
    for (i=1;i<=e;i++)
    {
        scanf("%i%i",&x,&y);
        G[x].push_back(y);
    }
    ok=1;
    while (ok)
    {
        ok=0;
        viz=0;
        for (i=1;i<=n;i++)
            if (!v1[i]&&cuplaj(i))
            {
                nr++;
                ok=1;
            }
    }
    printf ("%d\n",nr);
    for (i=1;i<=n;i++)
        if (v1[i])
            printf ("%d %d\n",i,v1[i]);
    return 0;
}