Pagini recente » Cod sursa (job #335832) | Cod sursa (job #1348281) | Cod sursa (job #241193) | Cod sursa (job #782735) | Cod sursa (job #239861)
Cod sursa(job #239861)
//brut
#include <cstdio>
#include <queue>
#include <vector>
#define N 10001
using namespace std;
int n,m,e,i,x,y,flux,s,j,tata[2*N];
short int f[2*N][2*N],E[2*N];
vector<int> L[2*N];
vector<int>::iterator it;
queue<int> C;
int bfs(int nod)
{
E[nod]=1;
for (C.push(nod); !C.empty(); C.pop())
for (it=L[C.front()].begin(); it!=L[C.front()].end(); it++)
if (!E[*it] && f[C.front()][*it])
{
tata[*it]=C.front();
if (*it==s) return 1;
E[*it]=1;
C.push(*it);
}
return 0;
}
void clear()
{
memset(E,0,sizeof(E));
memset(tata,0,sizeof(tata));
for (; !C.empty(); C.pop());
}
void scrie(int nod)
{
for (it=L[nod].begin(); it!=L[nod].end(); it++)
if (f[*it][nod])
{
printf("%d %d\n",nod,*it-n);
return;
}
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d\n",&n,&m,&e);
s=n+m+1;
for (i=1; i<=e; i++)
{
scanf("%d%d\n",&x,&y);
L[x].push_back(n+y);
L[n+y].push_back(x);
L[n+y].push_back(s);
f[x][n+y]=1;
f[n+y][s]=1;
}
flux=0;
for (i=1; i<=n+m; i++)
{
clear();
if (bfs(i))
{
for (j=s; tata[j]; j=tata[j])
{
f[tata[j]][j]-=1;
f[j][tata[j]]+=1;
}
flux++;
}
}
printf("%d\n",flux);
for (i=1; i<=n; i++) scrie(i);
return 0;
}