Pagini recente » Cod sursa (job #1484726) | Cod sursa (job #1087375) | Cod sursa (job #1167357) | Cod sursa (job #624718) | Cod sursa (job #913219)
Cod sursa(job #913219)
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 2005
#define inf 10
long i, n, m, nr1, nr2, a, b, inc, sf, el, nbf, nod, fmin, rez;
long cap[nmax][nmax], fl[nmax][nmax], co[nmax], viz[nmax], t[nmax];
vector <long> ma[nmax/2];
vector <long> ::iterator it;
void adauga()
{
ma[a].push_back(b); ma[b].push_back(a);
cap[a][b]=1;
}
void citire()
{
scanf("%ld %ld %ld",&nr1,&nr2,&m);
for (i=1;i<=m;i++)
{
scanf("%ld %ld",&a,&b);
a=a+1; b=nr1+b+1; adauga();
}
for (i=1;i<=nr1;i++)
{ a=1; b=i+1; adauga(); }
for (i=1;i<=nr2;i++)
{ a=nr1+i+1; b=nr1+nr2+2; adauga(); }
}
void bfs()
{
co[1]=1; inc=sf=1; nbf++; viz[1]=nbf;
while (inc<=sf)
{
el=co[inc]; inc++;
for (it=ma[el].begin();it!=ma[el].end();it++)
if ((viz[*it]<nbf) && (fl[el][*it]<cap[el][*it]))
{
viz[*it]=nbf;
co[++sf]=*it;
t[*it]=el;
}
}
}
void rezolvare()
{
n=nr1+nr2+2;
while (1)
{
bfs();
if (viz[n]==nbf)
{
nod=n;
while (nod>1)
{
fl[t[nod]][nod]++; fl[nod][t[nod]]--;
nod=t[nod];
}
rez++;
}
else
break;
}
}
void afisare()
{
printf("%ld\n",rez);
for (i=2;i<=nr1+1;i++)
for (it=ma[i].begin();it!=ma[i].end();it++)
if ((fl[i][*it]==1) && (*it>1))
printf("%ld %ld\n",i-1,*it-1-nr1);
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
citire();
rezolvare();
afisare();
return 0;
}