Pagini recente » Cod sursa (job #2308287) | Cod sursa (job #1159488) | Cod sursa (job #1098352) | Cod sursa (job #2668084) | Cod sursa (job #1921774)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
#define NMAX 10002
#define INF INT_MAX
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<int> U[NMAX], V[NMAX];
int dist[2 * NMAX];
int U_pair[NMAX], V_pair[NMAX];
int n, m;
#define NIL n + 1
bool BFS()
{
queue<int> Q;
for(int i = 1; i <= n; i++)
if(U_pair[i] == NIL)
{
dist[i] = 0;
Q.push(i);
}
else
dist[i] = INF;
dist[NIL] = INF;
while(!Q.empty())
{
int u = Q.front();
Q.pop();
if(dist[u] < dist[NIL])
for(int i = 0; i < U[u].size(); i++)
if(dist[V_pair[U[u][i]]] == INF)
{
dist[V_pair[U[u][i]]] = dist[u] + 1;
Q.push(V_pair[U[u][i]]);
}
}
return dist[NIL] != INF;
}
bool DFS(int u)
{
if(u != NIL)
{
for(int i = 0; i < U[u].size(); i++)
if(dist[V_pair[U[u][i]]] == dist[u] + 1)
if(DFS(V_pair[U[u][i]]))
{
V_pair[U[u][i]] = u;
U_pair[u] = U[u][i];
return true;
}
dist[u] = INF;
return false;
}
return true;
}
int main()
{
int e;
fin >> n>> m >> e;
for(int i = 0; i < e; i++)
{
int u, v;
fin >> u >> v;
U[u].push_back(v);
V[v].push_back(u);
}
for(int i = 1; i <= m; i++)
U[n + 1].push_back(i);
for(int i = 1; i <= n; i++)
U_pair[i] = NIL;
for(int i = 1; i <= m; i++)
V_pair[i] = NIL;
int matching = 0;
while(BFS())
{
for(int i = 1; i <= n; i++)
if(U_pair[i] == NIL)
if(DFS(i))
matching ++;
}
fout << matching << '\n';
for(int i = 1; i <= n; i++)
if(U_pair[i] != NIL)
fout << i << ' ' << U_pair[i] << '\n';
}