Cod sursa(job #1686152)

Utilizator MihaiEMihaiE MihaiE Data 12 aprilie 2016 09:00:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>
#include <cstring>
#include <algorithm>
#define nmax 10010

using namespace std;

int n,m,x,y,nr;
int r[nmax],l[nmax];
bool fr[nmax];
vector <int> g[nmax];

bool makepair(int nod)
{
    if (fr[nod]) return false;
    fr[nod]=true;

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

    for (int i=0;i<(int)g[nod].size();i++)
        if (makepair(r[g[nod][i]])) {
            l[nod]=g[nod][i];
            r[g[nod][i]]=nod;
            return true;
    }

    return false;

}

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

    scanf("%d %d %d",&n,&m,&nr);

    for (int i=1;i<=nr;i++) {
        scanf("%d %d",&x,&y); g[x].push_back(y);
    }

    bool ok=true;

    while (ok) {
        memset(fr,0,sizeof(fr)); ok=false;

        for (int i=1;i<=n;i++)
            if (l[i]==0) ok=ok|makepair(i);

    }

    int nr=0;

    for (int i=1;i<=n;i++)
        if (l[i]>0) nr++;

    printf("%d\n",nr);

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

    return 0;
}