Pagini recente » Cod sursa (job #2870951) | Cod sursa (job #1969377) | Cod sursa (job #2768060) | Cod sursa (job #2147901) | Cod sursa (job #2663932)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
const int NMAX = 10'001;
int len1, len2, m, L[NMAX], R[NMAX];
vector < int > G[NMAX];
bitset < NMAX > U;
bool cupleaza(const int& node) {
if(U[node] == 1)
return 0;
U[node] = 1;
for(int neighbor : G[node]) {
if(R[neighbor] == 0) {
L[node] = neighbor;
R[neighbor] = node;
return true;
}
}
// toti vecinii sunt cuplati
for(int neighbour : G[node]) {
if(cupleaza(neighbour)) {
L[node] = neighbour;
R[neighbour] = node;
return true;
}
}
return false;
}
int main() {
f >> len1 >> len2 >> m;
while(m--) {
int left, right;
f >> left >> right;
G[left].push_back(right);
}
bool ok{ true };
while(ok) {
ok = false;
U.reset();
for(int i = 1;i <= len1;++i)
if(L[i] == 0)
ok |= cupleaza(i);
}
vector < pair < int, int > > sol;
for(int i = 1;i <= len1;++i) {
if(L[i] != 0)
sol.push_back({i, L[i]});
}
g << (int)sol.size() << '\n';
for(auto& it : sol)
g << it.first << ' ' << it.second << '\n';
return 0;
}