Pagini recente » Cod sursa (job #2724621) | Cod sursa (job #3031177) | Cod sursa (job #255913) | Cod sursa (job #3281975) | Cod sursa (job #645241)
Cod sursa(job #645241)
#include<cstdio>
#include<bitset>
#include<queue>
#define infile "cuplaj.in"
#define outfile "cuplaj.out"
#define n_max 10005
#define FOR(g) \
for(pmuchie p = g; p ;p = p->urm)
using namespace std;
typedef struct muchie
{ int nod, cap, flux;
muchie *urm, *last;
} *pmuchie ;
pmuchie v[n_max], t[n_max];
bitset <n_max> uz;
int n, m;
int sursa, dest, cuplaj;
void add(int x, int y)
{
pmuchie p = new muchie, q = new muchie;
p->nod = y, q->nod = x;
p->last = q; q->last = p;
p->urm = v[x], q->urm = v[y];
v[x] = p; v[y] = q;
p->cap = 1; p->flux = q->flux = q->cap = 0;
}
void citeste()
{
freopen(infile,"r",stdin);
int E, x, y;
scanf("%d %d %d",&n, &m, &E);
while(E--)
{
scanf("%d %d",&x,&y);
add(x,y+n);
}
sursa = 0;
for(int i=1;i<=n;i++)
add(sursa,i);
dest = n+m+1;
for(int i=n+1;i<=n+m;i++)
add(i,dest);
fclose(stdin);
}
int bfs()
{
queue < int > q;
uz.reset();
q.push(sursa);
uz[sursa] = 1;
pmuchie p;
while(!q.empty())
{
p = v[q.front()];
q.pop();
for( ; p; p=p->urm)
if((p->cap - p->flux) > 0 && !uz[p->nod])
{
uz[p->nod] = 1;;
q.push(p->nod);
t[p->nod] = p;
if(p->nod == dest)
{
for( p = v[dest]; p; p = t[p->last->nod])
p->flux++, p->last->flux--;
return 1;
}
}
}
return 0;
}
void afiseaza()
{
freopen(outfile,"w",stdout);
printf("%d\n",cuplaj);
for(int i=1;i<=n;i++)
FOR(v[i])
if(p->flux == 1)
printf("%d %d\n",i,p->nod-n);
fclose(stdout);
}
int main()
{
citeste();
while(bfs())
cuplaj++;
afiseaza();
return 0;
}