Pagini recente » Cod sursa (job #1123102) | Cod sursa (job #742948) | Cod sursa (job #483848) | Cod sursa (job #1703731) | Cod sursa (job #2567078)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
bool go(int node, vector<bool> &used, vector<int> &leftnode, vector<int> &rightnode, vector<vector<int>> &g) {
used[node] = 1;
for(auto it : g[node]) {
if(!leftnode[it] || (!used[leftnode[it]] && go(leftnode[it], used, leftnode, rightnode, g))) {
leftnode[it] = node;
rightnode[node] = it;
return 1;
}
}
return 0;
}
int main() {
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int n, m, e;
in >> n >> m >> e;
vector<vector<int>> g(n + 1);
for(int i = 1; i <= e; i ++) {
int x, y;
in >> x >> y;
g[x].push_back(y);
}
int ok = 1;
vector<int> leftnode(m + 1, 0);
vector<int> rightnode(n + 1, 0);
vector<bool> used(n + 1, 0);
int ans = 0;
while(ok) {
ok = 0;
for(int i = 1; i <= n; i ++)
used[i] = 0;
for(int i = 1; i <= n; i ++)
if(!used[i] && !rightnode[i])
ok += go(i, used, leftnode, rightnode, g);
ans += ok;
}
out << ans << "\n";
for(int i = 1; i <= n; i ++)
if(rightnode[i])
out << i << " " << rightnode[i] << "\n";
return 0;
}