Pagini recente » Borderou de evaluare (job #2174598) | Borderou de evaluare (job #659241) | Borderou de evaluare (job #413546) | Borderou de evaluare (job #3024786) | Cod sursa (job #3350488)
#include <bits/stdc++.h>
using namespace std;
#define ST_DIO 0
#if ST_DIO
#define fin cin
#define fout cout
#else
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#endif // ST_DIO
int n, m, e, rasp, i, st[2 * 10002], dr[2 * 10002];
vector<int> gr[2 * 10002];
bool viz[2 * 10002], ok;
static inline bool Bipartit(int nod) {
viz[nod] = true;
for(int vec : gr[nod]) {
if(-1 == dr[vec]) {
st[nod] = vec;
dr[vec] = nod;
return true;
}
}
for(int vec : gr[nod]) {
if(!viz[dr[vec]] && Bipartit(dr[vec])) {
st[nod] = vec;
dr[vec] = nod;
return true;
}
}
return false;
}
int main() {
if(ST_DIO) ios_base::sync_with_stdio(false);
fin.tie(nullptr);
fout.tie(nullptr);
fin >> n >> m >> e;
for(i = 1; i <= e; i++) {
int x, y;
fin >> x >> y;
gr[x].push_back(n + y);
}
for(i = 1; i <= n + m; i++) st[i] = dr[i] = -1;
do {
ok = false;
for(i = 1; i <= n; i++) viz[i] = false;
for(i = 1; i <= n; i++) {
if(-1 == st[i]) ok |= Bipartit(i);
}
}
while(ok);
for(i = 1; i <= n; i++) rasp += (-1 != st[i]);
fout << rasp << '\n';
for(i = 1; i <= n; i++) {
if(-1 != st[i]) fout << i << ' ' << st[i] - n << '\n';
}
return 0;
}