Pagini recente » Cod sursa (job #1626743) | Cod sursa (job #2455518) | Cod sursa (job #889159) | Cod sursa (job #1832057) | Cod sursa (job #3040709)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
const int nmax = 1e4 + 5;
vector <int> edge[nmax];
int st[nmax], dr[nmax], viz[nmax];
bool find_pair(int node)
{
if(viz[node])
return false;
viz[node] = 1;
for(int i = 0; i < edge[node].size(); i++){
int curr = edge[node][i];
if(!dr[curr]){
dr[curr] = node;
st[node] = curr;
return true;
}
}
for(int i = 0; i < edge[node].size(); i++){
int curr = edge[node][i];
if(find_pair(dr[curr])){
st[node] = curr;
dr[curr] = node;
return true;
}
}
return false;
}
int main()
{
int n1, n2, m;
cin >> n1 >> n2 >> m;
for(int i = 1; i <= m; i++){
int x, y;
cin >> x >> y;
edge[x].push_back(y);
}
while(1){
bool ok = false;
for(int i = 1; i <= n1; i++)
viz[i] = 0;
for(int i = 1; i <= n1; i++){
if(!st[i])
ok |= find_pair(i);
}
if(!ok)
break;
}
vector <pair<int, int>> ans;
for(int i = 1; i <= n1; i++){
if(st[i])
ans.push_back({i, st[i]});
}
cout << ans.size() << "\n";
for(int i = 0 ; i < ans.size(); i++)
cout << ans[i].first << " " << ans[i].second << "\n";
return 0;
}