Pagini recente » Cod sursa (job #515714) | Cod sursa (job #2472352) | Cod sursa (job #387234) | Cod sursa (job #1205341) | Cod sursa (job #3307539)
#pragma GCC optimize("O3", "Ofast", "unroll-loops")
#include <bits/stdc++.h>
using namespace std;
const int NMAX=10000;
int n, k, e;
bool reversed;
vector<int> g[NMAX+1];
vector<int> mt;
vector<bool> used;
vector<pair<int, int>> ans;
bool try_kuhn(int v)
{
if(used[v])return false;
used[v]=true;
for(auto &to:g[v])
if(mt[to]==-1 || try_kuhn(mt[to]))
{
mt[to]=v;
return true;
}
return false;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
cin>>n>>k>>e;
if(n>k)
{
reversed=true;
swap(n, k);
}
for(int i=1, x, y; i<=e; i++)
{
cin>>x>>y;
if(reversed)swap(x, y);
g[x].push_back(y);
}
mt.assign(k+1, -1);
vector<bool> used1(n+1, false);
for(int v=1; v<=n; v++)
for(int &to:g[v])
if(mt[to]==-1)
{
mt[to]=v;
used1[v]=true;
break;
}
for(int v=1; v<=n; v++)
{
if(!used1[v])
{
used.assign(n+1, false);
try_kuhn(v);
}
}
for(int i=1; i<=k; i++)
if(mt[i]!=-1)
ans.push_back({mt[i], i});
cout<<ans.size()<<'\n';
for(auto &[x, y]:ans)
{
if(reversed)cout<<y<<' '<<x<<'\n';
else cout<<x<<' '<<y<<'\n';
}
return 0;
}