Pagini recente » Cod sursa (job #1699268) | Cod sursa (job #3001844) | Cod sursa (job #1749432) | Cod sursa (job #1410853) | Cod sursa (job #239868)
Cod sursa(job #239868)
//brut
#include <cstdio>
#include <cstring>
#include <queue>
#define N 10010
using namespace std;
typedef struct noduri
{
int val;
noduri *urm;
} adr;
int n,m,e,i,x,y,flux,s,j,tata[2*N],f[2*N][2*N],E[2*N],st[3][2*N];
adr *L[2*N],*p;
queue<int> C;
int bfs(int nod)
{
E[nod]=1;
for (C.push(nod); !C.empty(); C.pop())
for (p=L[C.front()]; p; p=p->urm)
if (!E[p->val] && f[C.front()][p->val])
{
tata[p->val]=C.front();
if (p->val==s) return 1;
E[p->val]=1;
C.push(p->val);
}
return 0;
}
void clear()
{
memset(E,0,sizeof(E));
memset(tata,0,sizeof(tata));
for (; !C.empty(); C.pop());
}
void afla(int nod)
{
for (p=L[nod]; p; p=p->urm)
if (f[p->val][nod])
{
flux++;
st[1][flux]=nod;
st[2][flux]=p->val-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);
p=new adr; p->val=n+y; p->urm=L[x]; L[x]=p;
p=new adr; p->val=x; p->urm=L[n+y]; L[n+y]=p;
p=new adr; p->val=s; p->urm=L[n+y]; L[n+y]=p;
f[x][n+y]=1;
f[n+y][s]=1;
}
for (i=1; i<=n+m; i++)
{
if (bfs(i))
for (j=s; tata[j]; j=tata[j])
{
f[tata[j]][j]=0;
f[j][tata[j]]=1;
}
clear();
}
flux=0;
for (i=1; i<=n; i++) afla(i);
printf("%d\n",flux);
for (i=1; i<=flux; i++) printf("%d %d\n",st[1][i],st[2][i]);
return 0;
}