Pagini recente » Cod sursa (job #2274585) | Cod sursa (job #3282548) | Cod sursa (job #10596) | Cod sursa (job #620531) | Cod sursa (job #2740418)
#include <bits/stdc++.h>
using namespace std;
#ifndef LOCAL
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
#define cin in
#define cout out
#endif //LOCAL
int n, m, e;
const int NMAX = 1e4 + 7;
const int INF = 1e9;
vector<int> adj[NMAX];
int pair_lft[NMAX];
int pair_rht[NMAX];
int dist[NMAX << 1];
queue<int> q;
bool bfs()
{
for(int i = 1; i <= n; i++)
{
if(!pair_lft[i])
{
dist[i] = 0;
q.push(i);
}
else
dist[i] = INF;
}
dist[0] = INF;
while(!q.empty())
{
int u = q.front(); q.pop();
for(auto v : adj[u])
{
if(dist[pair_rht[v]] == INF)
{
dist[pair_rht[v]] = dist[u] + 1;
q.push(pair_rht[v]);
}
}
}
return dist[0] != INF;
}
bool dfs(int u)
{
if(u == 0) return true;
for(auto v : adj[u])
if(dist[pair_rht[v]] == 1 + dist[u])
if(dfs(pair_rht[v]))
{
pair_rht[v] = u;
pair_lft[u] = v;
return true;
}
dist[u] = INF;
return false;
}
vector<pair<int, int>> cups;
int HK()
{
int matching = 0;
while(bfs())
{
for(int u = 1; u <= n; u++)
if(pair_lft[u] == 0)
if(dfs(u))
matching++;
}
return matching;
}
int main()
{
cin >> n >> m >> e;
for(int i = 0; i < e; ++i)
{
int x, y; cin >> x >> y;
adj[x].push_back(y);
}
cout << HK() << '\n';
for(int i = 1; i <= n; i++)
if(pair_lft[i] != 0) cout << i << " " << pair_lft[i] << '\n';
}