Pagini recente » Cod sursa (job #1906596) | Cod sursa (job #1235828) | Cod sursa (job #1278883) | Cod sursa (job #215747) | Cod sursa (job #720436)
Cod sursa(job #720436)
#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;
}