Pagini recente » Cod sursa (job #2981201) | Cod sursa (job #2706343) | Cod sursa (job #2388605) | Cod sursa (job #1973248) | Cod sursa (job #645224)
Cod sursa(job #645224)
#include<cstdio>
#include<vector>
#include<bitset>
#include<queue>
#define infile "cuplaj.in"
#define outfile "cuplaj.out"
#define n_max 10005
#define pb push_back
#define INF 1<<30
#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], edge[n_max];
bitset <n_max> uz;
int n, m;
int sursa, dest, cuplaj;
void add(pmuchie &p, int x)
{
pmuchie q = new muchie;
q->nod = x;
q->cap = 1;
q->flux = 0;
q->urm = p;
p = q;
}
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(v[x],y+n);
add(v[y+n],x);
v[x]->last = v[y+n];
v[y+n]->last = v[x];
}
sursa = 0;
for(int i=1;i<=n;i++)
{
add(v[sursa],i);
add(v[i],sursa);
v[sursa]->last = v[i];
v[i]->last = v[sursa];
}
dest = n+m+1;
for(int i=n+1;i<=n+m;i++)
{
add(v[dest],i);
add(v[i],dest);
v[dest]->last = v[i];
v[i]->last = v[dest];
}
fclose(stdin);
}
int bfs()
{
queue < int > q;
uz.reset();
q.push(sursa);
uz[sursa] = 1;
while(!q.empty())
{
int x = q.front();
q.pop();
if(x==dest)
continue;
FOR(v[x])
if((p->cap - p->flux) > 0 && !uz[p->nod])
{
uz[p->nod] = 1;;
q.push(p->nod);
edge[p->nod] = p;
}
}
if(!uz[dest])
return 0;
for( pmuchie p = v[dest]; p; p = edge[p->last->nod])
p->flux++, p->last->flux--;
return 1;
}
void rezolva()
{
while(bfs())
cuplaj++;
}
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();
rezolva();
afiseaza();
return 0;
}