Cod sursa(job #1970327)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 19 aprilie 2017 11:09:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

const char iname[] = "cuplaj.in";
const char oname[] = "cuplaj.out";

#define NMAX  10005
vector <int> G[NMAX];

int l[NMAX],r[NMAX],viz[NMAX];

int pairup(int nod)
{
    if(viz[nod]) return 0;
    viz[nod] = 1;

    for(int i = 0;i<G[nod].size();i++)
        if(!r[G[nod][i]])
        {
            l[nod] = G[nod][i];
            r[G[nod][i]] = nod;
            return 1;
        }

    for(int i =0;i< G[nod].size();i++)
        if(pairup(r[G[nod][i]]))
        {
            l[nod] = G[nod][i];
            r[G[nod][i]] = nod;
            return 1;
        }

    return 0;
}

int main(void)
{
    int n,m,e,a,b;
    freopen(iname, "r", stdin);
    freopen(oname, "w", stdout);

    scanf("%d%d%d",&n,&m,&e);
    for(;e--;)
    {
        scanf("%d%d",&a,&b);
        G[a].push_back(b);
    }

    int cuplaj = 0,ok=1;
    while(ok)
    {
        ok=0;
        memset(viz,0,sizeof(viz));
        for(int i=1;i<=n;i++)
            if(!l[i])
                if(pairup(i))
                    ok=1;
    }
    for(int i=1;i<=n;i++) if(l[i]) cuplaj++;

    printf("%d\n",cuplaj);
    for(int i=1;i<=n;i++)
        if(l[i]) printf("%d %d\n",i,l[i]);
}