Pagini recente » Cod sursa (job #797632) | Cod sursa (job #1852365) | Cod sursa (job #2893916) | Cod sursa (job #2786700) | Cod sursa (job #2955920)
#include<bits/stdc++.h>
#define inf INT_MAX
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n, m, e, a, b;
vector<int> v[20001];
queue<int> q;
int lv[20001];
int st[20001], dr[20001];
bool bfs()
{
for(int i = 1 ; i <= n ; i++)
if(!dr[i])
q.push(i), lv[i] = 0;
else
lv[i] = inf;///nod cuplat [i, dr[i]]
lv[0] = inf;///nodurile necuplate sunt cuplate cu 0
while(!q.empty())
{
int node = q.front();
q.pop();
if(lv[node] < lv[0]) ///daca il cuplez pe 0 cu cineva => am gasit cuplaj din lant de lungime minimia
{
for(auto next : v[node])
{
if(lv[st[next]] == inf) ///next e cuplat cu st[next]
{
lv[st[next]] = 1 + lv[node];///[node , next]; [next , st[next]]
q.push(st[next]);
}
}
}
}
return lv[0] != inf;///am gasit un lant
}
bool dfs(int node)
{
if(node != 0)
{
for(auto next : v[node])
if(1 + lv[node] == lv[st[next]] && dfs(st[next]))
{
///lv[node] + 1 == lv[st[next]] => [node , next] necuplat , [next , st[next]] cuplat
///daca dfs(st[next]) => [node , next] cuplat
st[next] = node;
dr[node] = next;
return true;
}
lv[node] = inf;///nu am gasit cuplaj
return false;
}
return true;
}
int maxmatch()
{
int ans = 0;
while(bfs())
{
for(int i = 1 ; i <= n ; i++)
if(!dr[i] && dfs(i))
ans++;
}
return ans;
}
int main()
{
f >> n >> m >> e;
fill(st, st + 20001, 0);
fill(dr, dr + 20001, 0);
for(int i = 1 ; i <= e ; i++)
{
f >> a >> b;
v[a].push_back(b);
}
g << maxmatch() << '\n';
for(int i = 1 ; i <= m ; i++)
if(st[i])
g << st[i] << ' ' << i << '\n';
return 0;
}