Pagini recente » Cod sursa (job #1375540) | Cod sursa (job #340479) | Cod sursa (job #2478123) | Cod sursa (job #2642692) | Cod sursa (job #1315332)
#include<fstream>
#include<vector>
#include<algorithm>
#define MAXN 10001
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int m, n, e;
vector<int> R, L, VIZ, G[MAXN];
void read() {
fin>>n>>m>>e;
int a, b;
while(e--) {
fin>>a>>b;
G[a].push_back(b);
}
L.resize(n+1, 0);
R.resize(m+1, 0);
VIZ.resize(n+1, 0);
}
bool pairup(int i) {
if(VIZ[i]) return false;
VIZ[i] = true;
for(int t=0; t<G[i].size(); t++) {
int vec = G[i][t];
if(!R[vec]) {
R[vec] = i;
L[i] = vec;
return true;
}
}
for(int t=0; t<G[i].size(); i++) {
int vec = G[i][t];
if(pairup(R[vec])) {
R[vec] = i;
L[i] = vec;
return true;
}
}
return false;
}
void solve() {
bool ok = 1;
while(ok) {
ok = 0;
fill(VIZ.begin(), VIZ.end(), false);
for(int i=1; i<=n; i++) {
if(!L[i])
ok |= pairup(i);
}
}
}
int cuplaj = 0;
void afis(int pas) {
if(pas > n) fout<<cuplaj<<'\n';
else {
if(L[pas]>0) {
cuplaj++;
afis(pas+1);
fout<<pas<<" "<<L[pas]<<'\n';
} else { afis(pas+1);
}
}
}
int main() {
read();
solve();
afis(1);
}