Pagini recente » Cod sursa (job #2374859) | Cod sursa (job #3240341) | Cod sursa (job #76603) | Cod sursa (job #1914708) | Cod sursa (job #1164363)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
const int MAX = 10500;
int N, M, E;
int L[MAX], R[MAX];
bool used[MAX];
vector<int> G[MAX];
void citire() {
ifstream in("cuplaj.in");
in >> N >> M >> E;
for(int i = 1, A, B; i <= E; i++) {
in >> A >> B;
G[A].push_back(B);
} in.close();
}
bool pairUp(int nod) {
if(used[nod])
return false;
used[nod] = true;
for(size_t i = 0; i < G[nod].size(); i++) {
int dest = G[nod][i];
if(!R[dest]) {
L[nod] = dest;
R[dest] = nod;
return true;
}
}
for(size_t i = 0; i < G[nod].size(); i++) {
int dest = G[nod][i];
if(pairUp(R[dest])) {
L[nod] = dest;
R[dest] = nod;
return true;
}
} return false;
}
void afisare() {
ofstream out("cuplaj.out");
int Ans = 0;
for(int i = 1; i <= N; i++)
Ans += (L[i] != 0);
out << Ans << "\n";
for(int i = 1; i <= N; i++) {
if(L[i])
out << i << " " << L[i] << "\n";
}
}
int main() {
citire();
for(int change = 1; change; ) {
change = 0;
memset(used, 0, sizeof(used));
for(int i = 1; i <= N; i++) {
if(!L[i])
change |= pairUp(i);
}
}
afisare();
}