Cod sursa(job #801492)

Utilizator geniucosOncescu Costin geniucos Data 24 octombrie 2012 15:38:37
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int x1,y1,i,n,m,e,ok,nr,u[10002],st[10002],dr[10002];
vector < int > h[10003];
int cupleaza(int nod)
{
    int i,j;
    if(u[nod]==1) return 0;
    u[nod]=1;
    for(j=0;j<h[nod].size();j++)
    {
        i=h[nod][j];
        if(dr[i]==0)
        {
            dr[i]=nod;
            st[nod]=i;
            return 1;
        }
    }
    for(j=0;j<h[nod].size();j++)
    {
        i=h[nod][j];
        if(dr[i]>0)
            if(cupleaza(dr[i]))
            {
                dr[i]=nod;
                st[nod]=i;
                return 1;
            }
    }
    return 0;
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d",&n,&m,&e);
for(i=1;i<=e;i++)
{
    scanf("%d",&x1);
    scanf("%d",&y1);
    h[x1].push_back(y1);
}
ok=1;
nr=0;
while(ok==1)
{
    ok=0;
    memset(u,0,sizeof(u));
    for(i=1;i<=n;i++)
        if(st[i]==0)
            if(cupleaza(i))
            {
                ok=1;
                nr++;
            }
}
printf("%d\n",nr);
for(i=1;i<=n;i++)
    if(st[i]) printf("%d %d\n",i,st[i]);
return 0;
}