Pagini recente » Cod sursa (job #794703) | Cod sursa (job #1036857) | Cod sursa (job #2611631) | Cod sursa (job #1440837) | Cod sursa (job #3227150)
#include <stdio.h>
#include <utility>
#include <vector>
#define N1 10000
#define N2 10000
std::vector <std::pair <int, int>> ans;
std::vector <int> vecini[1 + N1];
int cuplat_1[N1], cuplat_2[N2];
bool parcurs[N2];
int n1, n2;
bool exista_drum(int nod) {
for ( int vecin : vecini[nod] ) {
if ( !parcurs[vecin] ) {
parcurs[vecin] = true;
if ( cuplat_2[vecin] == 0 ) {
cuplat_1[nod] = vecin;
cuplat_2[vecin] = nod;
return true;
}
if ( exista_drum(cuplat_2[vecin]) ) {
cuplat_1[nod] = vecin;
cuplat_2[vecin] = nod;
return true;
}
}
}
return false;
}
int main() {
FILE *fin, *fout;
int m, x, y;
fin = fopen("cuplaj.in", "r");
fscanf(fin, "%d%d%d", &n1, &n2, &m);
for ( int i = 0; i < m; i ++ ) {
fscanf(fin, "%d%d", &x, &y);
vecini[x].push_back(y);
}
fclose(fin);
bool ok = true;
while ( ok ) {
ok = false;
for ( int i = 1; i <= n2; i ++ )
parcurs[i] = false;
for ( int i = 1; i <= n1; i ++ )
if ( !cuplat_1[i] && exista_drum(i) )
ok = true;
}
for ( int i = 1; i <= n1; i ++ )
if ( cuplat_1[i] )
ans.push_back({i, cuplat_1[i]});
fout = fopen("cuplaj.out", "w");
fprintf(fout, "%zu\n", ans.size());
for ( std::pair <int, int>& p : ans )
fprintf(fout, "%d %d\n", p.first, p.second);
fclose(fout);
return 0;
}