Pagini recente » Cod sursa (job #2246946) | Cod sursa (job #2460090) | Cod sursa (job #764770) | Cod sursa (job #3122731) | Cod sursa (job #898524)
Cod sursa(job #898524)
#include <stdio.h>
#include <vector>
using namespace std;
const int dim = 10002;
int N1, N2, N, M, C[dim], viz[dim];
vector <int> V[dim];
void cit ()
{
scanf ("%d%d%d", &N1, &N2, &M);
N = N1 + N2;
for (int i = 1, x, y; i <= M; i++)
{
scanf ("%d%d", &x, &y);
V[x].push_back (y + N1);
//V[y].push_back (x);
}
}
int rec (int n)
{
int i, f;
//viz[n] = 1;
for (i = 0; i < V[n].size(); i++)
{
f = V[n][i];
if (viz[f] == 0 && C[f] == 0)
{
C[n] = f;
C[f] = n;
return 1;
}
}
for (i = 0; i < V[n].size(); i++)
{
f = V[n][i];
if (viz[f] == 0)
{
viz[f] = 1;
if (rec (C[f]))
{
C[n] = f;
C[f] = n;
return 1;
}
}
}
return 0;
}
void rez ()
{
int ok = 1, i;
while (ok)
{
ok = 0;
for (i = 1; i <= N; i++)
viz[i] = 0;
for (i = 1; i <= N1; i++)
{
if (C[i] == 0)
{
if (rec (i))
{
ok = 1;
}
}
}
}
}
void afi ()
{
int nr = 0, i;
for (i = 1; i <= N1; i++)
if (C[i])
nr++;
printf ("%d\n", nr);
for (i = 1; i <= N1; i++)
if (C[i])
printf ("%d %d\n", i, C[i] - N1);
}
int main ()
{
freopen ("cuplaj.in", "r", stdin);
freopen ("cuplaj.out", "w", stdout);
cit ();
rez ();
afi ();
return 0;
}