Pagini recente » Cod sursa (job #780720) | Cod sursa (job #2843393) | Cod sursa (job #1747361) | Cod sursa (job #1802400) | Cod sursa (job #988169)
Cod sursa(job #988169)
#include <cstdio>
#include <cstring>
#include <vector>
#define FILEIN "cuplaj.in"
#define FILEOUT "cuplaj.out"
using namespace std;
const int NMAX = 10003;
int N, M, E;
vector<int> A[NMAX];
bool mark[NMAX];
int L[NMAX], R[NMAX];
bool cupleaza(int nod) {
if (mark[nod]) return 0;
mark[nod] = true;
for ( int i = 0; i < A[nod].size(); i++) {
if (!R[A[nod][i]]) {
L[nod] = A[nod][i];
R[A[nod][i]] = nod;
return true;
}
}
for ( int i = 0; i < A[nod].size(); i++) {
if (cupleaza(R[A[nod][i]])) {
L[nod] = A[nod][i];
R[A[nod][i]] = nod;
return true;
}
}
return false;
}
int main() {
freopen(FILEIN, "r", stdin);
freopen(FILEOUT, "w", stdout);
scanf("%d %d %d", &N, &M, &E);
for ( int i = 1; i <= E; i++) {
int x,y;
scanf("%d %d", &x, &y);
A[x].push_back(y);
}
int tmp = 1;
while(tmp) {
memset(mark, 0, sizeof(mark));
tmp = 0;
for ( int i = 1; i <= N; i++) {
if (!L[i])
if(cupleaza(i))
tmp = 1;
}
}
int sol = 0;
for ( int i = 1; i <= N; i++ ){
if (L[i] != 0)
sol++;
}
printf("%d\n", sol);
for ( int i = 1; i <= N; i++ ){
if (L[i] != 0)
printf("%d %d\n", i, L[i]);
}
return 0;
}