Pagini recente » Cod sursa (job #2952002) | Cod sursa (job #1750674) | Cod sursa (job #1394583) | Cod sursa (job #554078) | Cod sursa (job #723524)
Cod sursa(job #723524)
#include <cstdio>
#include <vector>
#include <cstring>
#define nMax 10010
using namespace std;
int n;
vector <int> graf[nMax];
int catre[nMax];
int deLa[nMax];
bool verificat[nMax];
void citire (){
int m;
scanf ("%d %d %d", &n, &m, &m);
while (m --){
int x;
int y;
scanf ("%d %d", &x, &y);
graf[x].push_back (y);
}
}
int cuplaj (int i){
if (verificat[i]){
return 0;
}
verificat[i] = 1;
for (int j = 0; j < graf[i].size(); ++ j){
if (!deLa[graf[i][j]]){
catre[i] = graf[i][j];
deLa[graf[i][j]] = i;
return 1;
}
}
for (int j = 0; j <graf[i].size(); ++ j){
if (cuplaj(deLa[graf[i][j]])){
catre[i] = graf[i][j];
deLa[graf[i][j]] = i;
return 1;
}
}
return 0;
}
void rez(){
int ok = 1;
while (ok){
ok = 0;
memset (verificat, 0, sizeof(verificat));
for (int i = 1; i <= n; ++ i){
if (!catre[i]){
ok += cuplaj(i);
}
}
}
int nr = 0;
for (int i = 1; i <= n; ++ i){
if (catre[i]){
nr ++;
}
}
printf ("%d\n", nr);
for (int i = 1; i <= n; ++ i){
if (catre[i]){
printf ("%d %d\n", i, catre[i]);
}
}
}
int main()
{
freopen ("cuplaj.in", "r", stdin);
freopen ("cuplaj.out", "w", stdout);
citire();
rez();
return 0;
}