Cod sursa(job #2406804)

Utilizator aditzu7Adrian Capraru aditzu7 Data 16 aprilie 2019 11:06:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>
#include <string.h>
using namespace std;
bool ok,viz[20005];
int x,y, l,r,e,dr[20005],st[20005];
int i,j;
struct nd{
int inf;
nd *urm;
} *l8[20005];
void adaug(nd *&u,int x){
nd *p;
p=new nd;
p->urm=u;
p->inf=x;
u=p;
}
int pairup(int nod){
int i,vec;
if(viz[nod]) return 0;
viz[nod]=1;
for(nd *j=l8[nod];j;j=j->urm){
    vec=j->inf;
    if(!dr[vec]||pairup(dr[vec]))
    {
        dr[vec]=nod;
        st[nod]=vec;
        return 1;
    }

}
return 0;

}
int main()
{
   freopen("cuplaj.in","r",stdin);
   freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&l,&r,&e);
    for(i=1;i<=e;i++){
        scanf("%d%d",&x,&y);
        adaug(l8[y],x);

    }
    ok=1;
    while(ok){
        ok=0;
        memset(viz,0,sizeof(viz));
        for(i=1;i<=r;i++)
        if(!st[i])
            ok=ok|pairup(i);

    }
    int s;
    s=0;
    for(i=1;i<=r;i++) if(st[i]) s++;
    printf("%d\n",s);
    for(i=1;i<=r;i++) if(st[i]) printf("%d %d\n",st[i],i);

    return 0;
}