Pagini recente » Cod sursa (job #839515) | Cod sursa (job #2616923) | Cod sursa (job #1944978) | Cod sursa (job #2223608) | Cod sursa (job #2769226)
#include <fstream>
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <unordered_set>
#include <string>
#include <unordered_map>
#include <random>
#include <ctime>
#include <queue>
using namespace std;
bool augment_path(int node, vector<int>& used, vector<int>& left, vector<int>& right, const vector<vector<int>>& graph){
if(used[node])
return false;
used[node] = true;
for(auto adj : graph[node])
if(right[adj] == 0 || augment_path(right[adj], used, left, right, graph)){
left[node] = adj;
right[adj] = node;
return true;
}
return false;
}
int main()
{
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
int N, M, E; cin >> N >> M >> E;
vector<vector<int>> graph(N + M + 1);
for(int x, y; E > 0; --E){
cin >> x >> y;
graph[x].push_back(y);
}
vector<int> left(N + 1, 0), right(M + 1, 0);
bool repeat = true;
while(repeat){
repeat = false;
vector<int> used(N + 1, false);
for(int i = 1; i <= N; ++i)
if(left[i] == 0 && augment_path(i, used, left, right, graph))
repeat = true;
}
int res = 0;
for(int i = 1; i <= N; ++i)
if(left[i])
++res;
cout << res << "\n";
for(int i = 1; i <= N; ++i)
if(left[i])
cout << i << " " << left[i] << "\n";
cin.close();
cout.close();
return 0;
}