Pagini recente » Cod sursa (job #2436840) | Cod sursa (job #219805) | Cod sursa (job #1195046) | Cod sursa (job #825548) | Cod sursa (job #1163232)
#include<stdio.h>
#include<vector>
#include<map>
using namespace std;
#define nmax 10005
#define Nmax 2*nmax
#define inf 10
int n, m, nrm, S, D, a, b, i, nrbf, inc, sf, ntd, el, nod, fmin, rez, j ;
vector <int> ma[Nmax];
vector <int> ::iterator it;
int co[Nmax], viz[Nmax], t[Nmax], td[Nmax];
map <int, int> fl[Nmax], cap[Nmax];
void adauga(int x, int y)
{
ma[x].push_back(y); cap[x][y]=1;
ma[y].push_back(x);
}
void citire()
{
scanf("%ld %ld %ld ",&n,&m,&nrm);
for (i=1;i<=nrm;i++)
{
scanf("%ld %ld",&a,&b);
adauga(a,b+n);
}
S=0; D=n+m+1;
for (i=1;i<=n;i++)
adauga(S,i);
for (i=1;i<=m;i++)
adauga(i+n,D);
}
void bfs()
{
nrbf++; inc=sf=1; ntd=0;
co[1]=S; viz[S]=nrbf;
while (inc<=sf)
{
el=co[inc]; inc++;
if (el==D)
break;
for (it=ma[el].begin();it!=ma[el].end();it++)
if (cap[el][*it]>fl[el][*it])
{
if (viz[*it]<nrbf)
{
viz[*it]=nrbf;
co[++sf]=*it;
t[*it]=el;
}
if ((*it)==D)
td[++ntd]=el;
}
}
}
void rezolvare()
{
while (1)
{
bfs();
if (viz[D]==nrbf)
for (i=1;i<=ntd;i++)
{
t[D]=td[i];
nod=D; fmin=inf;
while ((nod>S) && (fmin>0))
{
if (fmin>cap[t[nod]][nod]-fl[t[nod]][nod])
fmin=cap[t[nod]][nod]-fl[t[nod]][nod];
nod=t[nod];
}
nod=D;
if (fmin>0)
while (nod>S)
{
fl[t[nod]][nod]+=fmin;
fl[nod][t[nod]]-=fmin;
nod=t[nod];
}
rez+=fmin;
}
else
break;
}
}
void afisare()
{
printf("%ld\n",rez);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (fl[i][j+n]!=0)
printf("%ld %ld\n",i,j);
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
citire();
rezolvare();
afisare();
return 0;
}