Cod sursa(job #1538120)

Utilizator SilviuIIon Silviu SilviuI Data 28 noiembrie 2015 15:49:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <cstring>
#include <vector>
#define nmax 10010
using namespace std;
int n,m,i,j,x,y,nr,l[nmax],r[nmax];
vector <int> g[nmax]; bool fr[nmax];
bool ok;
bool makpair(int nod)
{
    if (fr[nod]) return false;
    fr[nod]=true;
    for (unsigned int i=0;i<g[nod].size();i++)
        if (r[g[nod][i]]==0) {
           l[nod]=g[nod][i];
           r[g[nod][i]]=nod;
           return true;
        }
    for (unsigned int i=0;i<g[nod].size();i++)
        if (makpair(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 (i=1;i<=nr;i++) {
    scanf("%d %d",&x,&y);
    g[x].push_back(y);
}
ok=true;
while (ok) {
    ok=false;
    memset(fr,0,sizeof(fr));
    for (i=1;i<=n;i++)
        if (l[i]==0) ok=ok|makpair(i);
}
nr=0;
for (i=1;i<=n;i++)
    if (l[i]>0) nr++;
printf("%d\n",nr);
for (i=1;i<=n;i++)
    if (l[i]>0) printf("%d %d\n",i,l[i]);
return 0;
}