Pagini recente » Cod sursa (job #1167371) | Cod sursa (job #642009) | Cod sursa (job #583696) | Cod sursa (job #444254) | Cod sursa (job #2784917)
#include <iostream>
#include <fstream>
#include <climits>
#include <cstdlib>
#define NMAX 10000
#define MMAX 10000
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int N, M, E, x, y;
bool adj[MMAX][NMAX];
bool visited[NMAX];
int assignTask[NMAX];
bool bipartiteMatch(int u)
{
for (int v = 0; v < N; ++v)
if (adj[u][v] && !visited[v])
{
visited[v] = true;
if (assignTask[v] < 0 || bipartiteMatch(assignTask[v]))
{
assignTask[v] = u;
return true;
}
}
return false;
}
int main()
{
fin >> M >> N >> E;
for (int i = 0; i < E; ++i)
{
fin >> x >> y;
adj[x - 1][y - 1] = 1;
}
for (int i = 0; i < N; ++i)
assignTask[i] = -1;
int jobCount = 0;
for (int u = 0; u < M; ++u) // all applicants
{
for (int i = 0; i < N; ++i) visited[i] = false;
if (bipartiteMatch(u)) jobCount++;
}
fout << jobCount << endl;
for (int i = 0; i < N; ++i)
if (assignTask[i] != -1) fout << assignTask[i] + 1 << " " << i + 1 << endl;
}