Pagini recente » Cod sursa (job #928402) | Cod sursa (job #1993125) | Cod sursa (job #2178099) | Cod sursa (job #2847204) | Cod sursa (job #428892)
Cod sursa(job #428892)
#include <stdio.h>
#include <string.h>
#include <vector>
#define NMAX 1002
#define LMAX 2002
#define HMAX 10005
#define INF 0x3f3f3f3f
#define pb push_back
using namespace std;
int n,m,l,C[LMAX][LMAX],F[LMAX][LMAX],Q[LMAX],dad[LMAX],r;
int flow,fmin;
struct date
{
int a,b;
};
date sol[HMAX];
vector <int> A[LMAX];
char viz[LMAX];
void read()
{
scanf("%d%d%d",&n,&m,&l);
int i,x,y;
for (i=1; i<=l; i++)
{
scanf("%d%d",&x,&y);
A[x].pb(y+n);
A[y+n].pb(x);
C[x][y+n]=1;
}
}
void prepare()
{
int i;
for (i=1; i<=n; i++)
{
C[0][i]=1;
A[0].pb(i);
A[i].pb(0);
}
for (i=n+1; i<=n+m; i++)
{
C[i][n+m+1]=1;
A[i].pb(n+m+1);
A[n+m+1].pb(i);
}
}
inline int min(int x,int y)
{
return x<y ? x : y;
}
int BF()
{
Q[0]=1; Q[1]=0;
memset(viz,0,sizeof(viz));
viz[0]=1;
int i,j,nod,vec;
for (i=1; i<=Q[0]; i++)
{
nod=Q[i];
for (j=0; j<A[nod].size(); j++)
{
vec=A[nod][j];
if (C[nod][vec]==F[nod][vec] || viz[vec])
continue ;
viz[vec]=1;
Q[++Q[0]]=vec;
dad[vec]=nod;
if (vec==n+m+1)
return 1;
}
}
return 0;
}
void solve()
{
int nod;
while (BF())
{
fmin=INF;
for (nod=n+m+1; nod!=0; nod=dad[nod])
fmin=min(fmin,C[dad[nod]][nod]-F[dad[nod]][nod]);
for (nod=n+m+1; nod!=0; nod=dad[nod])
{
F[dad[nod]][nod]+=fmin;
F[nod][dad[nod]]-=fmin;
}
flow+=fmin;
}
}
void get_sol()
{
int i,j;
for (i=1; i<=n; i++)
for (j=n+1; j<=n+m; j++)
if (F[i][j])
sol[++r].a=i, sol[r].b=j-n;
}
void show()
{
int i;
printf("%d\n",r);
for (i=1; i<=r; i++)
printf("%d %d\n",sol[i].a,sol[i].b);
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
read();
prepare();
solve();
get_sol();
show();
return 0;
}