Cod sursa(job #720436)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 22 martie 2012 17:43:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#define N 10005
using namespace std;
struct nod{ int val; nod *urm; }*G[N];
int n,m;
int l[N],r[N],viz[N];
void read()
{ int e,x,y;
  nod *aux;
freopen("cuplaj.in","r",stdin); scanf("%d %d %d\n",&n,&m,&e);
for(;e>=1;--e)
    {
    scanf("%d %d\n",&x,&y);
    aux=new nod; aux->val=y; aux->urm=G[x]; G[x]=aux;
    }
fclose(stdin);
}
int augm_path(int ind)
{ nod *aux;
if(viz[ind]==1)return 0;
else {
     viz[ind]=1;
     for(aux=G[ind];aux!=NULL;aux=aux->urm)
        if(r[aux->val]==0)
                {
                l[ind]=aux->val;
                r[aux->val]=ind;
                return 1;
                }
    for(aux=G[ind];aux!=NULL;aux=aux->urm)
        if(augm_path(r[aux->val]))
            {
            l[ind]=aux->val;
            r[aux->val]=ind;
            return 1;
            }
    return 0;
     }
}
void solve()
{ bool e;
  int i;
e=true;
while(e)
    {
    e=false;
    for(i=1;i<=n;++i)viz[i]=0;
    for(i=1;i<=n;++i)
        if(l[i]==0)
            {
            if(augm_path(i))e=true;
            }

    }
}
void write()
{ int sol,i;
freopen("cuplaj.out","w",stdout);
sol=0; for(i=1;i<=n;++i)if(l[i])++sol;
printf("%d\n",sol);
for(i=1;i<=n;++i)
    if(l[i])printf("%d %d\n",i,l[i]);
fclose(stdout);
}
int main()
{
read();
solve();
write();
return 0;
}