Pagini recente » Cod sursa (job #1267143) | Cod sursa (job #2039176) | Cod sursa (job #2614536) | Cod sursa (job #1914253) | Cod sursa (job #2670685)
#include <bits/stdc++.h>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int n, m, e;
const int NMAX = 10007;
const int INF = 1e9;
vector<int> adj[NMAX];
int pair_l[NMAX];
int pair_r[NMAX];
int dist[2 * NMAX];
queue<int> q;
bool bfs()
{
for(int i = 1; i <= n; i++)
{
if(pair_l[i] == 0) {
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_r[v]] == INF)
{
dist[pair_r[v]] = dist[u] + 1;
q.push(pair_r[v]);
}
}
}
return dist[0] != INF;
}
bool dfs(int u)
{
if(u != 0)
{
for(auto v : adj[u])
{
if(dist[pair_r[v]] == 1 + dist[u])
{
if(dfs(pair_r[v]) == true)
{
pair_r[v] = u;
pair_l[u] = v;
return true;
}
}
}
dist[u] = INF;
return false;
}
return true;
}
vector<pair<int, int>> cups;
int HopcroftKarp()
{
int matching = 0;
while(bfs())
{
for(int u = 1; u <= n; u++)
{
if(pair_l[u] == 0)
{
if(dfs(u))
{
//cout << u << " " << pair_l[u] << endl;
cups.push_back(make_pair(u, pair_l[u]));
matching++;
}
}
}
}
return matching;
}
int main()
{
in >> n >> m >> e;
for(int i = 0; i < e; i++)
{
int x, y; in >> x >> y;
adj[x].push_back(y);
}
out << HopcroftKarp() << endl;
sort(cups.begin(), cups.end());
for(auto e : cups)
out << e.first << " " << e.second << endl;
}