Pagini recente » Cod sursa (job #1931146) | Cod sursa (job #1691747) | Cod sursa (job #1739546) | Cod sursa (job #2251614) | Cod sursa (job #1443656)
#include <fstream>
#include <list>
#include <string.h>
using namespace std;
ifstream f1("cuplaj.in");
ofstream f2("cuplaj.out");
#define NMAX 10005
#define NIL 0
#define INF 0x0fffffff
#define FOR_LI(it,G) for(list<int>::iterator it=G.begin(); it != G.end(); it++)
list<int> Graf[NMAX];
int l[NMAX], r[NMAX], u[NMAX], cuplaj;
int pairup(int nod)
{
if ( u[nod] )
return 0;
u[nod]= 1;
FOR_LI(i, Graf[nod])
if ( !r[*i] )
{
l[nod]= *i;
r[*i]= nod;
return 1;
}
FOR_LI(i, Graf[nod])
if ( pairup(r[*i]) )
{
l[nod]= *i;
r[*i]= nod;
return 1;
}
return 0;
}
void HopcropfKarp(int n)
{
int change= 1, i;
while (change)
{
change= 0;
memset(u, 0, sizeof(u));
for (i=1; i<=n; i++)
if ( !l[i] )
change |= pairup(i);
}
cuplaj= 0;
for (i=1; i<=n; i++)
if ( l[i] > 0 )
cuplaj++;
}
int main()
{
int n, m, e, i, x, y;
f1>>n>>m>>e;
for (i=1; i<=e; i++)
{
f1>>x>>y;
Graf[x].push_back(y);
}
HopcropfKarp(n);
f2<<cuplaj<<"\n";
for (i=1; i<=n; i++)
if ( l[i] > 0 )
f2<<i<<" "<<l[i]<<"\n";
f2.close();
return 0;
}