Pagini recente » Istoria paginii runda/pentru_furnicik | Cod sursa (job #1168917) | Istoria paginii runda/gagaga/clasament | Cod sursa (job #1736642) | Cod sursa (job #3226592)
#include <iostream>
#include <cstring>
#include <vector>
#include <fstream>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
const int NMAX = 1e6 + 1;
vector<int> v[NMAX];
int l[NMAX], r[NMAX];
bool viz[NMAX];
int n,m,e;
bool cuplaj(int nod) {
if (viz[nod])
return false;
viz[nod] = true;
for (auto it : v[nod]) {
if (!l[it]) {
l[it] = nod;
r[nod] = it;
return true;
}
}
for (auto it : v[nod]) {
if (cuplaj(l[it])) {
l[it] = nod;
r[nod] = it;
return true;
}
}
return false;
}
int main() {
int t;
in>>n>>m>>e;
for (int i = 1; i <= e ; ++i) {
int x, y;
in >> x >> y;
y=y+n+1;
v[x].push_back(y);
v[y].push_back(x);
}
do {
memset(viz, 0, sizeof(viz));
bool change = false;
for (int i = 1; i <= n ; ++i) {
if (!r[i])
change |= cuplaj(i);
}
if (!change)
break;
} while (1);
int sum=0;
for(int i=1;i<=n;i++){
if(r[i]!=0) {sum=sum+1;}
}
out<<sum<<'\n';
for(int i=1;i<=n;i++){
if(r[i]!=0) {out<<i<<" "<<r[i]-n-1<<'\n';}
}
return 0;
}